JVM之内存分配与回收策略

15 篇文章 0 订阅

Java技术体系提倡的自动内存管理,最终,可以归结为自动化解决两个问题

  • 给对象分配内存
  • 回收分配给对象的内存

    给对象分配内存,大方向上,是在堆上分配,但也可能经过JIT编译后,被拆散为标量类型,并间接地栈上分配

对象主要分配在新生代的Eden区域,如果启动了本地线程分配缓冲,将按线程,优先在Thread Local Allocation Buffer上分配。少数情况下,可能会直接分配到老年代。

具体取决于使用哪种垃圾收集器组合,还有配置参数

对象优先在 Eden 分配

大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间分配时,虚拟机发生一次Minor GC

大对象直接进入老年代

-XX:PretenureSizeThreshold

长期存活对象进入老年代

-XX:MaxTenuringThreshold

Age计数器,如果Eden出生并经过第一次Minor GC 后存活,且能被Survior空间容纳,对象移动到Survivor,年龄+1

加到一定程度,默认是15,晋升到老年代

动态对象年龄判定

当Survivor中,相同年齡的对象大小,超过了Survivor空间的一半,这些年龄大于或等于这个年龄的对象,可以直接进入老年代

空间分配担保

新生代使用复制算法,当新生代出现大对象时,为保证能分配到空间,需要老年代的空间做担保,以便让大对象可以在新生代空间不足的情况下进入老年代,否则就只能Full GC

在Minor GC前,JVM 先检查老年代最大可用的连续空间是否大于 新生代所有对象的总和

-如果大于,Minor GC可以确保安全

-如果小于,JVM会看HandlePromotionFailure设置值是否允許担保失败,

–如果允许,检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小

---如果大于,尝试Minor GC

---如果小于,Full GC

–如果不允许,Full GC

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值