java 内存分配与GC策略


参考 《深入理解Java虚拟机_JVM高级特性与最佳实践》

内存分配

堆内存分为新生代层和老年代层,新生代层中放 最新分配内存的对象,这些对象中标记存活时间(GC触发时间增长),当时间增长到一定程度(默认15)或达到其它某些条件就将新生代中的对象转入老年代中。
这样将常用的对象与临时的对象分离,减少对常用对象的GC操作,提高效率。

新生代

新生代层内存分为eden区和survivor区。eden区用来存放最新分配的对象,新生代层经历了GC(MinorGC)存活下来的对象将放入survivor区。
为什么要分survivor区,GC回收大量对象内存会产生很多碎片,将存活的对象统一复制到survivor区,可以合并这些碎片。
survivor区分为两个独立的区,其中只有一个存放着存活对象。GC会扫描eden和存放存活对象的survivor区,将GC后依然存活的对象复制到另一个survivor区,然后清除eden区和原survivor区。

老年代

对象经过长时间生存,或者一个新对象过大,又或者是survivor区对象满足存活时间条件。那么这些对象会被送入老年代层。
因为存活很久的对象数量会比较少,大量的GC都是发生在新生代层的。如果老年代层内存不足将触发老年代层的GC(MajorGC),此时如果内存依旧不够用那么就会产生OOM

空间分配担保

由于survivor区大小要小于eden区,所以可能会出现MinorGC后存活对象大小超过survivor区。此时多出来的对象需要直接放入老年代层,这就叫空间分配担保。这之前会评估老年代层是否可以容纳下多出来的对象,如果存不下那么会触发MajorGC清理老年代层空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值