虚拟机对象探秘

本文深入探讨了虚拟机中对象的创建过程,包括内存分配策略如指针碰撞和空闲列表,以及并发分配时的同步处理和TLAB。接着介绍了对象内存布局的三个部分:对象头、实例数据和对齐填充,详细阐述了对象头中的信息和类型指针。最后,讨论了对象的访问定位方式,包括句柄和直接指针,并指出Sun Hot Spot虚拟机采用直接指针的方式以提高效率。
1.对象的创建
第一步,
虚拟机遇到new命令时,首先到常量池定位到一个类的符号引用,检查这个符号引用代表的 类是否
已被加载,解析和初始化过,如果没有则加载该类。

第二步,
虚拟机为新生成的对象分配内存所需空间大小在类加载完之后便已确定,java堆中的内存 很规整,用过的在一边,未用过的在另一边。中间放着指针作为临界点的指示器。指针挪动一段与 内存大小相同 的距离 #指针碰撞#
#如果不规整#,则需要维护一个列表,记录着哪些是可用,哪些不可用。#空闲列表#
PS:选择哪种方式则有java堆是否规整决定,是否规整又由虚拟机品牌(压缩整理功能)决定。
Serial,ParNew等带有Compact功能的虚拟机采用#指针碰撞# CMS 这种Mark-Sweep算法的采
用#空闲列表#

如果发生并发操作会如何?
有俩种法子:
1.对分配动作同步处理
2.每个线程在堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local Allocation Buffer)TLAB。只有当用完TLAB是才同步锁定 虚拟机是否用TLAB可通过-XX:+/-UserTlab决定。



2.对象的内存布局

对象在内存中存储的布局为3块区域:#对象头#,#实例数据#,#对齐填充#

#对象头#:
一部分在存储,对象自身运行时数据,HashCode,GC分代年龄,锁状态标志,线程持有
的锁,偏向线程ID,偏向时间戳等等。
另一部分:类型指针,指向他的类的元数据,虚拟机通过这个指针来确定该对象是那个类的实例
如果是数组,还存储数组长度。

#实例数据#,
存储各种类型的内容,先是父类的,再是子类

3.对象的访问定位

通过栈上的reference来访问堆上的对象。
访问方式俩种:句柄和直接指针
现在堆堆中开辟句柄池空间,



好处是快!!!!!!! Sun Hot Spot 采用第二种







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值