jvm内存图片展示
2020-06-15 14:51:55 0 举报
JVM一些浅薄的理解
作者其他创作
大纲/内容
局部变量表存放局部变量以及方法参数局部变量表的第一个变量是this指针
线程私有,因为多线程CPU在不同线程间进行切换,你切换以后再切换回来,需要知道刚才执行到了哪里,所以要记录下来
程序计数器
方法出口
栈中的元素就是栈帧,每一个方法,JVM都会为他分配一个栈帧。进行运行。方法间的调用,被调用者提前返回,这不就是对应了栈的先进后出吗?
对象在内存中的分布
凑字节的,可能没有
实例数据就是最简单的,对象属性的值,每个不一样
操作数栈
用于计算的临时数据存储区
动态链接。main方法中,我们new了一个test对象,这个只有在执行时候,会在堆空间开辟一块空间,而在没运行之前,只是一些符号,等到真正执行时候,指针指向堆中开辟的空间,就是动态链接
动态链接
局部变量表
大多时候,对象都在堆里,除非一种情况,逃逸分析,这个对象并不会在本方法外用到,生命周期在一个方法内,可能会在栈空间分配内存,其余时候都是在堆内存,包括类对象
对齐填充
方法区放的是操作指令,我们一个类大多会有许许多多的对象,但是每个对象调用方法,都是方法的操作都是一样得,只是参数不一样,所以这个东西做成共享的节省空间,类的一些元信息,就存在了方法区,可以理解为对象的公用属性以及一系列的常量,比如字符串常量池
栈
1. 对象头包含Mark Wordjava中的每一个对象都可以作为锁,就是因为Mark Word的原因,他的位置是可以复用的,既可以标记锁状态,也可以标记做垃圾回收,如果一个对象被当作锁了,那么垃圾回收肯定回收不了,这就是为什么看起来含不相干的方式,可以复用2. 类元信息指针对象由类创建的,所以指向它的本类,也就是堆内存中的头里有一个指针,指向方法区的类元信息3. 数组大小这个是只有数组对象才会有的特殊属性
对象头
执行完test2以后,main方法从哪里继续执行?记在这里
方法区(元空间)
main方法的栈帧
堆
实例数据
public static void main(String[] args) { Test test = new Test(); test.test2();}
0 条评论
下一页