JVM中有很多的垃圾收集器,根据应用自身的需要去进行调整选择。 简单的介绍下Serial(单线程收集器),ParNew(Serial的多线程版本), Parallel Scanverge,Serial Old,Parallel Old,CMS,G1收集器以及它们的优缺点。
Serial(单线程收集器)
在它进行垃圾收集时,必须停顿其他工作线程,直到收集结束。
ParNew
除Serial外只有它能与CMS收集器配合工作
Parallel Scanverge
该收集器可达到一个可控制的吞吐量。 吞吐量=运行代码时间/(运行代码时间 + 垃圾收集时间)
Serial Old
Serial的老年代版本,配合Parallel Scanverge使用,还可作为CMS收集器的后备方案。 在并发收集器收集发生Concurrent Mode Failure时使用。
Parallel Old
Parallel Scanverge老年代版本,可考虑Parallel Scanverge搭配Parallel Old, 在注重吞吐量以及CPU敏感的场合。
CMS
Concurrent Mark Sweep.从名称就可以看出该收集器是并发的标记清理垃圾。 主要流程分成以下几步: 初始标记(initial mark):标记GC Roots能关联到的对象 并发标记(concurrent mark):GC Roots Tracing 重新标记(remark):修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录 并发清除(concurrent sweep):该过程较为耗时,但可与用户线程并发 缺点:①对CPU资源敏感,并发线程会占用部分CPU资源而导致应用程序变慢,总吞吐量降低 ②无法处理浮动垃圾,由于并发清理阶段用户程序仍在运行,自然会有新的垃圾产生 ③标记清理导致内存中有大量的内存碎片产生,老年代无法找到足够大连续内存空间会提前触发full GC
G1收集器
特点:并行与并发,分代收集,空间整合,可预测停顿 G1将整个java堆划分为多个大小相等的独立区域(Region),在后台维护Region的优先列表,每次根据允许的收集时间, 优先回收价值最大的Region。