四 4.4堆 — 内存分配策略 TLAB 逃逸分析
学习渠道:尚硅谷
内存分配策略 TLAB 逃逸分析
A.内存分配策略【对象提升规则】
B.case演示大对象直接进入老年代
/**
* 大文件直接进入老年代
* 虚拟机相应参数:-Xms60m -Xmx60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails
* //初始堆,最大堆 老年代与新生代的比值 Eden区10分制占比(8占80%) -XX:+PrintGCDetails +代表带上后续参数
*/
public class MinorGC2OldAreaTest {
public static void main(String[] args) {
byte[] obj = new byte[1024 * 1024 * 20];//20MB
}
}
C.堆空间会为每个线程分配TLAB
抽象的TLAB的对象分配过程
TLAB细节【jdk7默认开启】
此时的对象分配过程TLAB
注:Eden分配上述的N代表GC
D.常用堆参数设置
官网链接
重新设置过的JVM参数会有:
E.空间分配担保
F.逃逸分析–堆并非是分配对象存储的唯一选择
逃逸分析技术是一种有效减少Java程序中同步负载以及内存堆分配压力的跨函数全局数据流分析算法
JDK7默认开启
如果对象未发生逃逸,,生命周期局限在某个虚拟机栈(方法中),那么该变量不会有GC,不需要有并行相关的安全性考虑
G.逃逸分析相关Demo
Tips:
1.如何快速地判断是否发生了逃逸分析,,我们可以查看new的对象实体是否有可能在方法外进行调用
2.开发中能使用局部变量的,就不要方法外进行定义了
H.逃逸分析做的代码优化
1.栈上分配策略
Demo:
开启逃逸分析那么对象将会被直接分配在栈上
如果主动取消逃逸分析 JVM参数: -Xms1G -Xmx1G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails
开启逃逸分析:JVM参数: -Xms1G -Xmx1G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails
倘若将上述的JVM参数中的1G内存都改为256M,我们直观的看出:
2.同步省略–锁取消
3.分离对象和标量替换
这样上面的标量就放到了栈帧的局部变量表当中,可以减少堆内存的占用,减少GC
分析结果同上述类似。。【耗时少,减少GC发生的次数】
I.逃逸分析相关小结
- 逃逸分析技术并不成熟