对象的创建过程

1.对象的创建过程(半初始化)
分配内存 默认值(半初始化)
特殊调用,调用构造方法,设为初始值
建立引用

2.对象在内存中的存储布局 JOL
markword(对象头) --8字节 所记录信息:1:锁,2:hachCode,3:GC相关
klass pointer(类型指针) --4字节 类指针 64位机器为64bit,为8字节,默认压缩4字节 见下图篇p2
instance data(实例数据)–无变量,0字节,有则依次递增+4 成员变量 压缩为4字节 见下图p2
padding(对齐)提高效率 能被8整除

P2
3.对象的分配:

栈上–线程本地–Eden-Old
TLAB(线程本地分配):
多线程向eden区分配对象时,必须做线程同步(抢占位置),因此出现TLAB优化,为每个线程分配自己区域。
AGE:当对象年龄标记到达阈值15(通过-XX:MaxTenuringThreshold=15设置,默认为15),将对象从幸存者区移动到老年代

如果确定一个对象的作用域不会逃逸出方法之外,那可以将这个对象分配在栈上,这样,对象所占用的内存空间就可以随栈帧出栈而销毁。在一般应用中,不会逃逸的局部对象所占的比例很大,
如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,无须通过垃圾收集器回收,可以减小垃圾收集器的负载。
栈上分配的技术基础:
    一是逃逸分析:逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体。
    二是标量替换:允许将对象打散分配在栈上,比如若一个对象拥有两个字段,会将这两个字段视作局部变量进行分配。

虚拟机提供了一个-XX:PretenureSizeThreshold参数,大于这个值的参数直接在老年代分配

偏向锁:
实现:将线程id设置到markword

自旋锁:
有人竞争(自旋锁,轻量级锁,无锁)
每个线程在线程栈中生成LockRecord,用CAS方式尝试把自己的指针更新到markword
每一次锁重入,都会有LockRecord

重量级锁:
自旋是要占用CPU的,线程数量过多的时候用自旋不合适
升级的条件:(OLD)10次,PreSpinLock,cpu/2
现在:Adaptive CAS(自适应自旋:由JVM进行,不用自行)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值