垃圾收集器 | 线程方式 | 收集算法 | GC停顿 | 优点 | 缺点 | 使用 | 其他 |
Serial | 单线程 | 复制算法 | 是 | 适用于Client 模式下的新生代, 简单高效(相比于其他单线程) | 会暂停用户线程导致GC停顿 | -XX:+UseSerialGC | - |
ParNew | 多线程 | 复制算法 | 是 | 适用于Server 模式下, 支持多线程和指定线程数量控制 , 可以和CMS配合使用 | 会暂停用户线程导致GC停顿 , 单CPU下 不会别Serial好 | -XX:+UseParNewGC | -XX:ParallelGCThreads设置收集器线程数量, 默认开启和cpu数目相同数量的线程 |
Parallel Scavenge | 多线程 | 复制算法 | 是 | 可控制的吞吐量和自适应调节策略 | 会暂停用户线程导致GC停顿 | -XX:UseParallelGC | -XX:MaxGCPauseMillis设置收集停顿时间,大于0的毫秒数 , 设置的越小 , 停顿时间越短 , 吞吐量下降, gc发生频繁 . -XX:GCTimeRatio设置垃圾收集时间占总时间的比率 , 值为0<n<100的整数 , 吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间) |
Serial Old | 单线程 | 标记-整理算法 | 是 | 适用于Client 模式下单线程老年代最优 | 会暂停用户线程导致GC停顿 | 年轻代使用Parallel Scavenge, Linux下1.6,1.7,1.8默认开启老年代SerialOld垃圾收集器 | CMS收集器的后备预案 |
Parallel Old | 多线程 | 标记-整理算法 | 是 | 适用于Server 模式下, 支持多线程和指定线程数量控制 | 会暂停用户线程导致GC停顿 | -XX:+UseParallelOldGC | DK1.6才开始提供 , 在年老代同样提供吞吐量优先的垃圾收集器 , 可以和CMS配合使用 |
CMS (Concurrent Mark Sweep) | 多线程 | 标记-清除 | 基本上垃圾收集线程与用户线程同时工作 | 获取最短垃圾回收停顿时间 , 并发收集、低停顿 | 需要更多的内存,产生大量内存碎片 | -XX:+UseConcMarkSweepGC | 收集运作过程: 1.初始标记(期间停顿) 2.并发标记 3.重新标记(期间停顿) 4. 并发清除 |
G1 (Garbage first ) | 多线程 | 标记-整理 | 低停顿 | 不产生内存碎片, 分代收集 独立管理整个GC堆(新生代和老年代) | 需要更多的内存,产生大量内存碎片 | -XX:+UseG1GC | 收集运作过程:把堆内存划分为大小固定的几个独立区域 , 步骤:1.初始标记(期间停顿) 2.并发标记 3.最终标记(期间停顿) 4. 筛选回收(回收时用"复制"算法,从一个或多个Region复制存活对象到堆上的另一个空的Region, 在此过程中压缩和释放内存) . 参数: -XX:InitiatingHeapOccupancyPercent设置当整个Java堆的占用率达到参数值时,开始并发标记阶段;默认为45 . -XX:MaxGCPauseMillis设置暂停时间目标,默认值为200毫秒 . -XX:G1HeapRegionSize设置每个Region大小,范围1MB到32MB |