一、垃圾回收算法
1.标记-清除算法
标记所有要回收的对象,在标记完成之后统一回收
2.标记-整理算法
将所有存活的对象向一端移动,清楚边界外的所有对象
3.复制算法
将内存块分为两分(Eden 和 Survivor,大小8:1),一开始仅启用Eden,在垃圾回收时,将Eden中所有存活的对象移到Survivor中
4.分代收集算法
非单独的一种算法。新生代每次垃圾收集时都仅有少量对象存活,故使用复制算法,而老年代对象存活率高,故可以使用标记-清楚算法或标记-整理算法
二、垃圾收集器
1.Serial old(标记-清除算法)
2.Serial(复制算法)
单线程执行垃圾回收,会stop the world(中断所有的用户进程)
3.ParNew(复制算法)
多线程执行垃圾回收,同样有stop the world的问题
4.Parallel Scavenge(复制算法)
为了提高吞吐量
5.Parallel Old(标记-整理算法)
6.CMS
仅用于进行老年代和永久代的垃圾回收
它不能等到old内存用尽时回收,需要在内存用尽前,完成回收操作,否则会导致并发回收失败。
触发阈值,默认是老年代或永久代达到92%
步骤:
a.初始化标记:标记gc root可达的对象,会导致stop the world
b.并发标记:从初始化标记标记的“根”对象,找所有被引用的对象
c.重新标记:修正并发标记时对象的改动(dirty card)
d.并发清除:并发清除不可达的对象
7.G1
将堆内存分成很多个块,每个块都有自己的新生代和老年代,每次回收时,回收垃圾最多的块