1Java虚拟机的组成部分
1对虚拟机栈的理解
每个线程都有自己的栈,栈中的数据都是以栈帧的格式存在。
对于栈帧的理解
在每个线程上正在执行的每个方法都各自对应一个栈帧
每个栈帧都存放
对于局部变量表、操作数栈、动态链接、方法出口的理解
局部变量表:定义一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用。
注意:局部变量表中也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。
0: iconst_1 将int类型常量1 压入 操作数栈
1: istore_1 将int类型的值存入局部变量1
4: iload_1
5: iload_2
2对方法区的理解
方法区看做是一块独立于java堆的内存空间。
元空间不在虚拟机设置的内存中,而是使用本地内存。
方法区有:类型信息、常量、静态变量、及时编译器编译后的代码缓存等
non-final 与 final的区别:
对运行时常量池和常量池的理解:
常量池:可以看成是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。
3对本地方法栈的理解?存放本地方法的空间
4对堆的理解
几乎所有的Java对象都是在Eden区被new出来的,绝大多数的Java对象的销毁也是在新生代。
关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不再永久区/元空间收集。
5对于程序计数器的理解
作用:PC寄存器用来存储指向下一条指令的的地址,也即将要执行的指令的代码,由执行引擎读取下一条指令。