四 4.5堆 --- 内存分配策略 TLAB 逃逸分析 小结

四 4.4堆 — 内存分配策略 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.逃逸分析相关小结

  • 逃逸分析技术并不成熟
    在这里插入图片描述

J.堆章节小结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值