Java虚拟机内存区域分配
2018-02-21 本文已影响16人
begonia_rich
主要从虚拟机对整个分配的进程内存划分,这里的划分都是逻辑划分,理解这些对于Java并发的理解也有帮助
Java虚拟机运行时数据区
Java虚拟机运行时数据区1程序计数器(线程私有):可以看成当前线程所执行的字节码的行号指示器
2Java虚拟机栈(线程私有):它描述的是方法执行的内存模型(每个方法的执行都以创建栈帧的形式调用)
3本地方法栈(线程私有):跟虚拟机栈一样的,只不过这里存储的是本地方法
4Java堆(共享):基本上就是存放对象实例的。按照GC的划分,这里被划分为新生代/老年代
5方法区(共享):主要存储类信息,常量,静态变量等。按照GC的划分,这里被称为持久代
在1.8之后把持久代取消了,改为元空间,方法区不变。这里的持久代和元空间都是以垃圾回收的角度进行的设计,和从JVM出发的设计内存布局不是一个纬度。
对象的内存布局,主要有三部分
1对象头:包含两部分
1.1存储自身运行时数据如HashCode,GC分代年龄,锁状态,线程持有的锁等
1.2存储类型指针:即对象指向它的类元数据的指针
这里可以看出来虚拟机对于对象实例也有很多可以自行存储的空间,这也是为虚拟机实现自己的功能而保留设计的。
2实例数据:在获得内存之后,进行归零操作,执行<init>()方法(构造方法相对应)则开始初始化数据
属性信息都在这里
3对齐填充:保持分配的内存大小为8的倍数
这里有必要先说一下实例对象和类对象的关系,实际上实例对象只存储属性信息,对于方法等信息都是在类对象进行的描述(通过JVM定义的字节码指令进行栈操作),都是固定的。后面在说class文件结构的时候就可以看的很清楚。
总结
理解好Java虚拟机的内存划分是为了更好的理解后面的垃圾回收以及类加载,虚拟机运行时数据内存分配等功能。