JVM专题
MQ专题
NoSQL专题
多线程专题
分布式专题
数据库专题
算法专题
网络编程专题
JDK专题
源码专题
分布式框架专题
JVM运行时数据区的组成结构、各个部分的作用
程序计数器的作用是什么
代码异常后如何执行
为什么finally总会被执行
java内存区域是什么?局部变量在哪里?

java编译器把java代码变成字节码class文件 通过执行引擎解释字节码指令 执行命令
JVM创建线程执行main方法 包含独立计数器:记录现存执行位置 虚拟机栈 本地方法栈
main方法执行时 搭建好虚拟机栈 调用时把栈帧放在虚拟机栈中
方法执行时如果需要new对象都要放在堆中,局部变量在虚拟机栈中的局部变量表
main执行,其内部方法也会入栈,内部方法执行完毕后其栈帧出栈 ——GC自动回收内存;
方法内部的局部变量都是在栈帧中存储;main方法执行完毕后 栈帧自行出栈,局部变量数据销毁
虚拟机栈基于线程 大小缺省是1M
StackFlowError 递归调用栈帧压栈不出栈会导致堆栈溢出

程序计数器:执行到5:iloda_2 CPU时间片到了/main调用其他方法,目前线程停止执行 ; 下次恢复继续执行;
完成出口:记录当前线程正在执行的字节码指令地址,便于返回
ExceptionTable异常表:遇到异常查表是否存在出路匹配条目,找到就压入栈帧;跳转到catch块执行异常处理;
找不到就抛向方法调用者;如果异常一直上抛,main也无法处理时JVM终止线程 将堆栈信息打印控制台;
正常执行路径;try块顺利执行完毕,程序流会执行一遍finally块 然后再逻辑返回;确保覆盖所有可能的退出路径
异常执行路径;try或catch遇到return;JVM会记住返回结果/异常对象,
然后转而执行finally块 执行完毕再返回结果/异常
处理未被当前catch捕获的异常;编译器为finally块生成异常表覆盖整个trycatch块
查找异常表时执行其中代码,如果找不到就上抛,作为最后的安全网
线程共享内存区域 主要存储类信息、常量、静态变量;——非堆+运行时的常量池
JVM在运行JAVA程序时的内存区域
堆:存放对象实例和数组 所有new创建的对象都要在这里分配内存
方法区:存储
线程私有区域