图解使用两块 Survivor 区的原因

文章通过对比分析说明了在Java JVM中使用两块Survivor区而非一块的原因。主要讨论了当仅使用一块Survivor区时,Minor GC会导致内存碎片化和效率降低的问题,而使用两块Survivor区则可以有效避免这些问题,确保内存得到充分利用,减少Full GC的发生,从而提高系统性能。
摘要由CSDN通过智能技术生成

如果只使用一块 Survivor 区:

当发生一次 Minor GC 时,回收 Eden 区的垃圾,把存活的对象复制到 Survivor 区,如下图:

ok,目前看起来并没有什么区别。但是当发生第二次 Minor GC 时,问题就出现了。我们来看一下,第二次 Minor GC 时发生了什么:

如果此时发生 Minor GC:

会出现这种情况:

很明显,这样会出现内存碎片化,这样会严重影响到性能。而且 Survivor 区得不到充分利用,很快就会被填满,而使对象存入老年代,这样会使 Full GC 发生的更加频繁,进而影响性能。


使用两块 Survivor 区:

此时发生 Minor GC:

然后,重点来了。复制完成后,交换 Survivor0 与 Survivor1:

程序继续运行至下图情况时:

此时再次发生 Minor GC 时,会发生如下情况:

复制完成后,再次交换 Survivor0 与 Survivor1:

 

由此看出,这样一来就保证了内存不会出现碎片化,能被充分利用。


参考文章:https://blog.csdn.net/antony9118/article/details/51425581

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值