对象的分配过程以及创建过程,单例模式DCL就一定没有问题吗,如果发生指令重排了会导致什么问题?

本文介绍了Java对象在内存中的分配过程,包括逃逸分析、TLAB(线程本地分配缓冲)以及对象创建的三大步骤。针对单例模式的DCL(双检锁)实现,讨论了volatile关键字防止指令重排以确保线程安全的重要性。同时,文章还提到了静态代码块、构造代码块、成员变量与静态变量的区别以及静态方法的使用注意事项。
摘要由CSDN通过智能技术生成

上篇文章主要讲了对象的定位,以及jdk的优化技术逃逸分析和标量替换,这样的新技术出现,就导致java对象实例都分配在堆内存里面也变得不是那么的绝对了。

对象的分配过程如下:

方法里面开始new一个对象,即时编译器会对这个对象的动态作用域进行分析,如果满足逃逸分析和标量替换的条件,并启用了标量替换,那么就在当前栈帧里面去分配对象,等待方法执行完毕,随着方法的出栈,此对象也就消失了。如果不满足要求,那么会分配到堆内存里面,分配之前会判断,如果对象的大小太大了(jvm调优里面有个参数XX:PretenureSizeThreshold控制对象体积的阀值),就会直接分配到老年代(避免大对象在年轻代来回拷贝),在老年代里面等待FullGC回收;如果对象不是很大,就会分配到年轻代的eden区,第一次垃圾回收后,对象进入幸存者区,接着等待垃圾回收,垃圾回收的时候对象会在幸存者区里面的from和to两者之间来回拷贝,每换一次位置,对象的年龄就加1,等到年龄满15之后(CMS默认为6),对象就进入老年代;进入老年代之后就等待着老年代的垃圾回收器接着回收,知道生命周期结束。如下图所示:

将新生对象直接分配到eden区的时候,其实jdk做了一些优化的,就叫TLAB,啥意思呢,TLAB的全称是:Thread Local Allocation Bu

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值