HotSpot虚拟机java对象
分类:
文章
•
2024-02-20 12:18:10
HotSpot虚拟机java对象
java普通对象的创建
- new 先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,检查这个类是否被加载,解析,初始化,没有则需要进行相应的类加载过程
- 分配内存,类加载完成后确定的大小
- 线程安全解决方案
- 对分配内存空间的动作进行同步处理,实际上虚拟机是采用cas加上失败重试
- 每个线程在堆中预先分配内存,称为本地线程分配缓冲(TLAB),缓冲区用完了,分配新缓冲区才需要同步锁定
- 虚拟机把分配到的内存空间(不包括对象头)都初始化为0值,这一步让java实列对象字段不用付初值就能使用
- 对对象进行必要设置,把一些信息保存到对象头中
- 在虚拟机视角,一个新对象已经产生,但是从java程序来看,对象创建才刚开始——构造函数(Class文件中方法还没执行),所有字段都是默认的0值。
对象的内存布局
- 对象在堆内存中的存储布局可以划分为三个部分:对象头(Header),实例数据(Instance Data),对象填充(Padding)。
对象头
第一类:MarkWord

第二类:类型指针
- 对象指向它的类型元数据的指针,jvm通过这个指针来确定该对象是那个类的实列。
- 并不是所有虚拟机实现都必须在对象数据上保留类型指针,也就是查找对象元数据信息不一定要经过对象本身。
- 如果对象是个数组,对象头还需要一个记录数组长度的数据。
对象的访问定位
-
句柄:堆需要划分一块出来做句柄池,一块做实列池,reference储存对象句柄地址
-
直接指针:reference中存储对象地址
- HotSpot主要使用直接指针访问