垃圾收集器

01)Serial 是历史悠久的收集器,在垃圾回收期间或中断用户线程,适合于单个CPU,单线程的情况下面,如果在桌面运行程序下面 即Client模式下面虚拟机来说是一个很好的选择,因为停顿时间很小。是新生代收集器

02)ParNew收集器

ParNew 是Serial的多线程版  是新生代收集器

 公用的参数:-XX:SurvivorRatio,-XX:PretenureSizeThreshold,

-XX:HandlePromotionFailure ,收集算法一模一样,而且这两款收集器公用了很多共同的代码。其中Serial 和ParNew收集器可以和CMS收集器共同使用。而Parallel Scavenge 无法与CMS收集器共同使用。

03)Paraller Scavenge 是新生代收集器 它是尽可能缩短停顿时间,提高吞吐量

吞吐量=运行用户代码所用时间/(运行用户代码所用时间+垃圾收集时间)

Parallel Scavenge 收集器自适应调节策略 开启参数 -XX:+UseAdaptiveSizePolicy,设置-XX:MaxGCPauseMillis参数或者-XX:GCTimeRatio就可以使用自适应调节策略。这个也是他和ParNew收集器的区别,这个时候,九不在需要设置-XX:Xms ,eden区和Survivor的比值。

04)Serial old收集器是老年代收集器 使用标记整理算法,新声代都使用复制算法

在Client模式下面的虚拟机使用

05)Paraller Old收集器是Paraller Scavenge的老年代版本,Paraller Old收集器与Serial Old非常接近。其中 ParNew 和 Paraller Old  和Paraller Scavenge 都是并行收集器。

06)CMS收集器

 是并发收集器,停顿时间最短。流程为初始标记,就是仅仅标记一下 GC ROOTs可以关联到的对象,初始标记也会中断用户线程,并发标记:进行GC Roots Tracing ,重新标记:则是修改并发期间用户程序继续运作而导致的标记产生变动的那一部分的标记记录,这个时间比初始标记时间要长,也要中断用户线程,但是远比并发标记时间段,之后便是并发清理。由于在整个过程中,初始标记和重新标记会中断用户线程,而并发清理和并发标记则会和用户线程一块运行,所以停顿时间短。

缺点:01)对CPU特别敏感,CMS默认启动的回收线程数是(cpu+3)/4 ,如果CPU小于2,那么CMS对于CPU的资源的占用会特别明显,会导致用户程序执行速度变慢。

02)由于使用标记清理算法,会导致空间不连续。

03)无法处理浮动垃圾,就是在进行并发清理阶段而产生的垃圾,如果CMS运行期间预留的空间不够,无法满足程序需要,那么会导致大量的Concurrent Mode Failure,此时就会启用备用的Serial Old会影响效率。

04)G1收集器

  过程:初始标记 就是仅仅标记GC Roots可以到达的对象,并且修改TAMS的值,让下一个阶段用户并发运行时候,能够在正确可用的Region区域创建新的对象,这个时候需要停顿用户线程,但是耗时很短。并发标记:就是GC Roots开始对堆中对象进行可达性分析,找出存活对象,这个阶段时间较长,但是可以与用户线程一起执行,之后便是最终标记:是为了修正在并发标记期间因为用户线程而导致的对象变化的那部分记录,虚拟机将这段记录在线程Remembered Set logs 里面,最终标记阶段是将Remember Set中去,最终标记阶段需要停顿线程。但是筛选回收阶段则首先对各个Region区域的回收成本和价值进行排序,根据用户期望的GC停顿时间来制定回收计划,筛选回收虽然可以与用户线程并发执行,但是停顿用户线程后,筛选回收的执行效率会更高,所以此时筛选回收也是中断用户线程。

原文地址:https://www.cnblogs.com/histlyb/p/6719316.html