jvm 垃圾回收:新生代都是复制算法,老年代都是标记整理算法

1、为什么新生代都是复制算法

因为新生代对象生存时间比较短,80%都是要回收的对象,采用标记-清除算法则内存空间碎片化严重,采用复制算法可以灵活高效,且便与整理空间。

2、老年代都是标记整理算法

标记整理算法解决来标记-清除算法的内存碎片化的问题,又解决了复制算法的两个Survivor区的问题,因为老年代的空间比较大,不可能采用复制算法,特别占用内存空间,

3、为什么要设置两个Survivor区

首先看下复制算法:Survivor区,一块叫From,一块叫To,对象存在Eden和From块。当进行GC时,Eden存活的对象全移到To块,而From中,存活的对象按年龄值确定去向,当达到一定值(年龄阈值,通过-XX:MaxTenuringThreshold可设置)的对象会移到年老代中,没有达到值的复制到To区,经过GC后,Eden和From被清空。之后,From和To交换角色,新的From即为原来的To块,新的To块即为原来的From块,且新的To块中对象年龄加1。永远有一个survivor space是空的,另一个非空的survivor space无碎片。

为什么要这么做?

  • 没有Survivor区,eden区对象直接去老年代,造成老年代频繁FGC。
  • 一个Survivor容易使得Survivor的空间碎片化,因为eden区又存活对象,Survivor区也有存活对象,辅助的时候就会存在碎片化空间。
  • 即若只分一块Survivor,在清除Survivor区已死亡的对象时,因为此刻的Survivor区还有存活的对象,清除要比分两块Survivor麻烦,两块的情况,回收时只需将存活的对象移走,剩下的对象直接清理即可。
  • 另外,分成两块Survivor,From和To分工明确,逻辑理解和技术实现较简单。

参考博客

你可能感兴趣的:(java基本知识)