本文参考周志明老师的《深入理解Java虚拟机》
一.运行时数据区
1.虚拟机栈、本地方法栈、程序计数器是线程私有的。堆和方法区是线程公有的。
2.PC:可以看作是当前线程所执行的字节码的行号指示器。
3.Java虚拟机栈:线程私有。 内部是栈帧(包括:局部变量表,操作数栈,动态连接,方法出口等信息)。每一个方法从执行直至完成的过程,都对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
4.本地方法栈:Native方法
5.Java堆:线程共享。存放对象实例。垃圾回收器管理的主要区域。
6.方法区:线程共享。存储类信息,常量,静态变量。
7.运行时常量池:方法区的一部分。存放Class文件的常量池内容(字面量和符号引用)。
8.直接内存。他并不是RTDA的一部分。了解即可。
二.对象
1.普通Java对象的创建
func new_a_object{
if(类符号引用没被加载){
加载类;
}
//(为了保证并发下正确同步处理保证更新原子性或线程分配在不同空间(本地线程分配缓冲))
根据java堆分内存;
清零;//不清对象头
设置对象头;(那个类的实例、如何找类元数据信息、对象哈希码、GC年龄分代...)
<init>方法;(从java代码角度,就是构造方法)
}
2.对象内存布局
对象头(Header):第一部分:哈希码、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等。第二部分:类型指针,即指向它类元数据的指针,通过它来确定它是那个类的实例。如果是java数组,还需要一个记录数组长度的数据。
实例数据:java程序中锁定的各种类型字段内容。
填充内容。
3.对象定位访问
方式一:句柄访问(GC时只需要修改到对象实例数据的指针)
方式二:直接指针访问(更快)