JVM 主体结构
JVM 作用
JVM是java虚拟机(Java Virtual Machine),其实现了“一次编译,处处运行”的功能。
如果没有JVM,我们编写java代码时,如果想在Windows平台上运行,那就需要编写一套
适用于Windows平台的。如果想在linux平台上运行,则编写一套linux的。
JVM主体结构
JVM 内存区域大致分为:
Class文件、类装载子系统、运行时数据区、执行引擎
线程私有和线程公有
线程公有:
在运行时数据区中,方法区和堆是属于线程公有的,也就是这两块区域是“循环利用”的,所以要对其进行垃圾回收。其是在虚拟机启动时创建。
线程私有:
虚拟机栈、本地方法栈、程序计数器是属于线程私有的,其与线程“同生死”,属于“一次性”的,所以不用对其进行垃圾回收
JVM的栈帧
定义:
栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈的栈元素。
作用:
每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机里面从入栈到出栈的过程。
JVM 运行时栈帧结构
上面程序转换为栈帧如图所示
逐步分析:
public static int test();
Code:
0: iconst_3
1: istore_0
2: iconst_2
3: istore_1
4: iload_0
5: iload_1
6: imul
7: istore_2
8: iload_2
9: ireturn
}
0: iconst_3 相当于将 int 型3放入栈顶
1: istore_0
2: iconst_2
3: istore_1
将栈顶int型数值存入第一个本地变量
将int型2放入栈顶
将栈顶int型数值存入第二个本地变量
4: iload_0
5: iload_1
将指定的int型本地变量推送至栈顶
6: imul
将栈顶两int型数值相乘并将结果压入栈顶
7: istore_2
8: iload_2
将int 6出栈 放入局部变量表
复制局部变量表第三个元素放入栈中
栈帧之间传值
两个栈帧作为虚拟机栈的元素是完全独立的,但是虚拟机会做出相应的优化,令两个栈帧出现一部分重叠。