java逃逸分析和TLAB及对象分配过程
所属分类 java
浏览量 1586
逃逸分析
TLAB(Thread Local Allocation Buffer)
论文《Escape Analysis for Java》
用连通图来构建对象和对象引用之间的可达性关系,并在此基础上,提出一种组合数据流分析法。
由于算法是上下文相关和流敏感的,并且模拟了对象任意层次的嵌套关系,所以分析精度较高,只是运行时间和内存消耗相对较大。
绝大多数逃逸分析 基于 封闭世界(closed world)
所有可能被执行的方法在做逃逸分析前都已经得知,并且程序的实际运行不会改变它们之间的调用关系 。
Java许多特性,例如动态类加载、调用本地函数以及反射程序调用等,都将打破 “封闭世界”的约定。
对象的三种逃逸状态
GlobalEscape(全局逃逸), 即一个对象的引用逃出了方法或者线程。
ArgEscape(参数级逃逸) 这种状态可以通过分析被调方法的二进制代码确定。
NoEscape(没有逃逸),一个可以进行标量替换的对象。可以不将这种对象分配在堆上。
逃逸分析结果优化
对象堆分配变成栈分配
消除同步 ,逃逸分析可以判断出某个对象是否始终只被一个线程访问
矢量替代 ,逃逸分析方法如果发现对象的内存存储结构不需要连续进行的话,就可以将对象的部分甚至全部都保存在CPU寄存器内,提高访问速度。
开启逃逸分析
-verbose:gc -XX:+DoEscapeAnalysis
TLAB
JVM在内存新生代Eden Space中开辟一小块线程私有的区域,称作TLAB(Thread-local allocation buffer),默认占用Eden Space的1%
应用中有很多短命小对象 ,它们不存在线程共享适合被快速GC,小对象通常会优先分配在TLAB上
TLAB上的分配 是线程私有 不需要加锁 分配效率高
TLAB结合bump-the-pointer技术 实现快速的对象分配,不需要任何的锁同步 ,不用锁住整个堆
start end 起始地址, top(指针)表示已经分配到哪里了
分配新对象时,移动top,当top和end相遇时表示该缓存已满
start top end
Java对象分配过程
1 逃逸分析确定对象是在栈上分配还是在堆上分配。堆上分配则2
2 如果tlab_top + size <= tlab_end,则在TLAB上直接分配对象并增加tlab_top 的值,如果TLAB 剩余空间不够 则 3
3 重新申请一个TLAB,并尝试存放当前对象。如果放不下,则4.
4 在Eden区加锁(多线程共享),如果eden_top + size <= eden_end 则将对象存放在Eden区,增加eden_top 的值,如果Eden区不足则5.
5 执行一次Young GC(minor collection)
6 Young GC之后,Eden区还是放不下,则直接分配到老年代。
上一篇
下一篇
spring资源Resource接口
oauth2.0要点
网络问题排查要点
centos时区问题
java8 jvm 参数
CMS JVM参数介绍