《深入理解java虚拟机》第二章读书心得
刚学习完了这本书的第二章,我做一个总结。
java虚拟机在运行是的数据区如下图所示:
-
程序计数器:内空间比较小,可以看作是当前线程所执行的字节码的行号指示器。
-
Java虚拟机栈:虚拟机栈描述的是java方法执行的内存模型
-
本地方法栈:作用和虚拟机栈类似,只不过本地方法栈是为虚拟使用到的Native方法服务
-
Java堆:java虚拟机所管理的内存中最大的一块,并且在虚拟机启动时候创建,用来存放实例对象,java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
-
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分。
程序计数器、java虚拟机栈、本地方法栈是线程隔离的。可以说他们随线程而生,随线程而灭。每个线程有自己独有的区域,互不影响。
堆和方法区是线程共享的内存区域。
在HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:
对象头、实例数据、对齐填充。 -
对象头:对象头分为两部分,一部分用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向时间戳等。
一部分是类型指针,即对象指向它的类元数据的指针。
2.实例数据: 对象存储的有效信息 -
对齐填充:不是必然存在的,仅仅起着占位符的作用。因为HotSpot VM 的自动内存管理要求对象的大小必须是8的倍数,当实例数据部分没有对齐时,需要通过对齐填充来补全。