跟叶子猿学习JVM(三)对象的创建、对象内存分配、对象的访问

1、对象的创建

New 类名 → 根据new的参数在常量池中定位一个类的符号引用 → 如果当前常量池中没有这个符号引用,说明这个类还没有被加载,则进行类的加载,解析和初始化 → 虚拟机为对象在堆中分配内存  →  将分配的内存初始化(不包括对象头) → 调用对象的<init>方法(构造方法等)

2、对象的内存分配

给对象分配内存可以通过指针碰撞、空闲列表的方式,但是这两种方式都存在线程安全性问题,我们如果把这两种方式都加上同步处理的话可以实现线程安全,但是效率会很低下。所以使用本地线程分配缓冲(ThreadLocalAllocationBuffer,简称:TLAB)的方式是一种更好的选择。因为这种方式既可以实现线程安全也能够保证效率,它的原理是:给每个线程在内存中都分配一块自己的区域,自己只操作这一块属于自己的区域,当这块区域用满时,扩充此区域,扩充的时候加上同步处理,保证线程安全。

参考:

指针碰撞分配 
如果内存是绝对规整的,即左右两边分别是已占用内存和闲置内存,中间有分界点的指针指示器,那么内存分配仅仅在于指针的移动,这种分配方式叫做“指针碰撞”。

空闲列表分配 
如果内存不规整,即已使用和空闲的内存交错分布,那么虚拟机必须维护一个列表,记录哪些内存可用。创建对象时从列表中找到一块足够大的空间划分给对象使用,同时更新列表记录。这种分配方式称为“空闲列表”。

以上两种分配取决于内存是否规整,而内存是否规整又由垃圾收集器是否带有压缩整理功能决定。

 

3、对象的访问

句柄访问:在堆内存中分配一块内存作为句柄池,引用变量中存放对象的句柄地址,而句柄中包含了对象的实例数据地址信息和类型数据的地址信息

直接指针访问:引用变量中存储的直接就是对象地址了

比较:

使用句柄来访问的最大好处就是引用变量中存储的是稳定的句柄地址,对象被移动(在垃圾收集时移动对象是很普通的行为)时就会改变句柄中实力数据指针,但是引用变量所指向的地址不用改变。

而使用直接指针访问方式最大的好处就是速度更快,节省了一次指针定位的时间开销,但是在对象被移动时,又需要改变引用变量的地址。在我们上面分析的例子中,就是使用的直接指针访问的方式。

 

下一篇:https://blog.csdn.net/Peacock__/article/details/88838155

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值