Java内存分配、对象布局、锁升级
2020-04-27 11:30:13 0 举报
java内存分配、对象布局、锁升级
作者其他创作
大纲/内容
epoch
通过工具JOL分析new 对象的对象布局
e5 01 00 20 (11100101 00000001 00000000 00100000) (536871397)
62位
54位
指向互斥量(重量级锁)的指针
未使用
Thread-local allocation buffer在EdenSpace区为每个线程划分一个区域,默认配置为1%,因为堆是对每个线程共享的,线程在堆上分配对象需要加锁操作
重量级锁
25位
1位
2位
(object header)
2、对象布局
分代年龄
轻量级锁
4
8字节对齐
匿名偏向
方法调用结束,栈pop
01 00 00 00 (00000001 00000000 00000000 00000000) (1)
偏向锁
1位偏向锁位
栈
锁状态
3、Markword分析
2位锁标志位
01
当前线程指针
Survivor1
没有逃逸
OldGen
0
偏向锁未启动
OFFSET
指向线程栈帧中的锁记录LockRecord的指针
4位
逃逸分析
GC过程中用到的标记信息
00 00 00 00 (00000000 00000000 00000000 00000000) (0)
1、GlobalEscape(全局逃逸):对象的引用复制给了一个类对象,或者包含在另一个全局逃逸的对象里2、ArgEscape(参数级逃逸):方法调用过程中传递对象引用给另一个方法3、NoEscape(没有逃逸):一个可以进行标量替换的对象
VALUE
CMS:15G1:6
对象大小
分析:Object o = new Object()
普通对象
轻度竞争
发生逃逸
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version></dependency>
11
12
hashCode(如果有调用)
Survivor2
FGC:MinorGC+MajorGC
AGE
Object o,对象指针在没压缩的情况下占8个字节,在压缩的情况下占4个字节,参数为UseCompressedOops
end
new
开启逃逸分析的jvm参数:-XX:+DoEscapeAnalysis
Klasspointer,类指针通过java -XX:+PrintCommandLineFlags -version查看是否启用类指针、普通对象指针压缩在64bit计算机上不启用的话为8个字节,启用的话为4个字节
小
MarkWord,记录hashCode、GC、锁信息
大
1、内存分配
java -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=132982848 -XX:MaxHeapSize=2127725568 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGCjava version \"1.8.0_111\
8
31位
TLAB
无锁
SIZE
重度竞争
10
TYPE DESCRIPTION
EdenSpace
4、锁升级
对象刚创建
偏向锁已启动
偏向锁的时间戳
00
1
从类的markword上可以发现分代年龄只占4位,所有可调节的参数-XX:MaxTenuringThreshold,最大为15
padding
GC标记信息
MinorGC
GC清除
0 条评论
回复 删除
下一页