Java虚拟机(内存模型)教程

2021-07-25由程序员日记发表于系统教程 浏览26次

代码参考解析示例
在这里插入图片描述
内存模型示例
在这里插入图片描述
以下参考上面两图
1,本地方法栈:调用 native 的方法时,实际该方法时本地方法,本方法的实现在类包中,则本地方法栈是存放该方法的内存地址;

2_1,栈(compute()栈帧):局表变量表是 compute()方法中的变量;操作数栈是a=1,b=2等一系列赋值运算操作的临时空间地址,操作完成后变量 a,b存放进局部变量表中;动态链接存放compute()方法的内存地址,当执行方法时根据这个地址找到对应的方法;方法出口 是存放compute()方法的位置,当方法执行完成时,再从当前位置继续向下执行,而不是man方法再从新开始执行;
2_2,栈(main()栈帧):局部变量表中存放的是 实例 math的内存地址(相当于指针),指针指向堆中(实例存在在堆中);
3,程序计数器:下图为 Math.class文件转换为 .text 文件后,可以看出程序的执行步骤,例如compute()下的 0步是声明变量a,1步 是将变量a赋值,假设当执行到1步 时线程被挂起则程序计算器 = 1,当执行到11步被挂起则程序计算器 = 11;作用是当该线程重新获得cpu资源需要执行时,则从挂起的步骤继续向下执行,而不是重新执行;而程序计算器值得更新是字节码执行引擎完成的;
在这里插入图片描述
4,方法区(元空间):存放变量,静态变量,类信息(示例中的 initdata,user),该方法区中存放的 user 是 user实例的内存地址,实例同样存放在堆中;
5,本地方法查找,栈,程序计数器是私有的,堆,方法区是共有的;例如:A,B两线程,各自拥有自己的方法查找,栈,程序计数器,但堆和方法区它们用的是同一个