目前新生代垃圾收集器有Serial,ParNew,Parallel Scavenge; 老年代收集器有CMS,Serial Old,Parallel Old;G1这款垃圾收集器既能用于新生代又能用于老年代。
1,Serial收集器:
描述: 单线程收集器;他进行垃圾收集时,必须暂停所有的工作线程, 直到它收集结束;新生代采取复制算法暂停所有用户线程, 老年代采取标记-整理算法暂停所有用户线程。
现状: 目前为止, 依然是虚拟机运行在Client模式下的默认新生代收集器。收集几十兆甚至一两百兆的新生代, 停顿时间完全可以控制在几十毫秒最多一百毫秒以内。
2,ParNew收集器:
描述: 其实就是Serial的多线程版本;使用多线程进行垃圾收集;新生代采取复制算法暂停所有用户线程,老年代采用标记-整理算法暂停所有用户线程。
现状: 许多运行在Server模式下的虚拟机默认的新生代收集器;一个与性能无关的原因是:除了Serial收集器外, 目前只有它能与CMS收集器配合使用。
注:
ParNew收集器是使用-XX:+UseConcMarkSweepGC选项后的默认新生代收集器; 也可以使用-XX:UseParNewGC指定它
可以使用-XX:+ParallelGCThreads参数限制垃圾收集的线程数
3,Parallel Scavenge收集器:
描述: Parallel Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是cpu用于运行用户代码的时间与CPU总消耗时间的比值, 即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
参数: 最大垃圾收集停顿时间设置:-XX:MaxGCPauseMillis, 设置值是一个大于0的毫秒数, 收集器将尽可能地保证内存回收花费的时间不超过设定值。
GC停顿时间的缩短是以牺牲吞吐量和新生代空间来换取的,可能会把新生代调小一些, 以使在规定的时间内可以完成垃圾回收; 也可能为了减小停顿时间而增大GC频率。
-XX:+GCTimeRatio:设置一个大于0且小于100的整数值, 也就是垃圾收集时间占总时间的比率,如果设置成x, GC时间的占比就是 1/(1+x)