jvm内存一目了然的简单描述
jvm基本结构
jvm内存模型
jvm的内存区域,又成为jvm的运行时数据区,主要分为五大块:方法区、堆、虚拟机栈、本地方法栈、程序计数器
jvm内存 - 线程共享部分(方法区,堆)
方法区和堆,看图即明白
方法区作用:存放字节码文件转换成的的类信息
堆:唯一目的就是存放对象实例,几乎所有的对象、数组都在这里存放
-
jvm在加载Teacher和Student的时候,把Teacher和Student的所有类相关信息全部加载到了方法区,后续在Teacher chen = new Teacher()时,会在堆里面创建一个陈老师实例。
简单概括:方法区存了类的全量信息,堆里面存的是类的实例或者也可以称之为实例的数据 -
陈老师的属性stu,是一个引用,他指向堆中的学生实例(图中没有画出stu实例,自行脑补)。
引用不只是在栈里面,堆实例里面也可以存在引用 -
方法区也存在垃圾回收,回收效率很低
jvm内存 - 线程独占部分(虚拟机栈、本地方法栈、程序计数器)
虚拟机栈
为了方便记录方法调用,帮助实现方法先进后出的一个数据结构。
main方法调用show01(),show01()调用show02(),show02()调用show03(),在执行顺序上,是从main -> show01 -> show02 ->show03,在方法执行完成的顺序上,是show03->02->01->main,虚拟机栈的作用就是不断的按照执行顺序把方法压栈,然后再从03开始pop。
图中的每一个方法,都代表一个栈帧
栈帧
栈帧代表的是一个方法的调用
本地变量表:存放了当前调用方法中所有变量
动态链接:方法的调用 --> 执行的代码 --> 代码存在方法区 --> 动态链接指向方法区的代码
操作数栈:临时存放区域(本地变量表里的数据就是从操作数栈里拿的)
返回地址:指向地址,可以理解为 等号 int result = show01();
本地方法栈
本地方法栈类似于虚拟机栈,只不过本地方法栈调用的是native方法(c、c++相关API)
程序计数器
如图,用于记录线程中的字节码执行到哪个一个状态(指令的编号)
画图不易,转载还请注明出处,谢谢
[5]: https://www.cnblogs.com/yuechuan/p/8984262.html/
[参考文章1][5]