垃圾回收算法的实现原理

分代收集算法:标记清除、复制、标记整理算法

新生代的存活周期比较短,适合使用复制算法。

新生代:eden区域和survive0和survive1(比例是8:1:1),其中eden区域存放刚建立的对象,当eden区域内存用完时会发生GC,存活的对象存入survive0,清空eden区域。当survive0的内存也用完时,继续进行GC,保留eden和survive0区域的存活对象,将其复制到survive1区域,清空eden和survive0区域。交换survive0和survive1的角色,一直循环,直到某个survive区域不足以存放另一个survive和eden区域的存活对象时,将这个survive的对象转移到老年代区域。由于新生代对象存活时间短,需要复制的对象少,所以适合使用复制算法;

老年代:老年代的区域和新生代的区域为2:1。当老年代内存也满了,进行一次全局回收(fullGC)。老年代对象存活率高,使用的回收方法是标记整理算法,标记存活的对象,将其移动到一端(与标记清除算法的区别),回收不存活对象。

永久代:存放静态文件,如静态类和静态方法。但是JDK1.8用元空间取代了永久代。储存在永久代的数据(方法区的数据)一直在转移,转移到堆中。Jdk1.6出现永久代益处,jdk1.7和jdk1.8出现堆溢出。

点击此处
隐藏目录