垃圾收集算法是内存回收的方法论, 垃圾收集器是内存回收的具体实现。
7种作用于不同分代(新生代收集器/老年代收集器)的收集器, 如果两个收集器之间存在连线, 就说明它们可以搭配使用。
1. Serial收集器
单线程的收集器,它进行垃圾收集时, 必须暂停其他所有的工作线程, 直到它收集结束。
2. ParNew收集器
ParNew收集器其实就是Serial收集器的多线程版本。
3. Parallel Scavenge收集器:“吞吐量优先”收集器。
多线程收集器。
CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间。停顿时间越短就越适合需要与用户交互的程序, 良好的响应速度能提升用户体验。
Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量( Throughput) 。高吞吐量则可以高效率地利用CPU时间, 尽快完成程序的运算任务, 主要适合在后台运算而不需要太多交互的任务。
吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值, 即吞吐量=运行用户代码时间/( 运行用户代码时间+垃圾收集时间) 。
Parallel Scavenge收集器提供了两个参数用于精确控制吞吐量, 分别是控制最大垃圾收集停顿时间的-XX: MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX: GCTimeRatio参数。
4. Serial Old收集器
Serial Old是Serial收集器的老年代版本, 它同样是一个单线程收集器, 使用“标记-整理”算法。 这个收集器的主要意义也是在于给Client模式下的虚拟机使用。 如果在Server模式下, 那么它主要还有两大用途: 一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案, 在并发收集发生ConcurrentMode Failure时使用。
5. Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本, 使用多线程和“标记-整理”算法。
6. CMS收集器
CMS( Concurrent Mark Sweep) 收集器是一种以获取最短回收停顿时间为目标的收集
器。CMS收集器是基于“标记—清除”算法实现。是一款面向服务端应用的垃圾收集器。
初始标记( CMS initial mark)
并发标记( CMS concurrent mark)
重新标记( CMS remark)
并发清除( CMS concurrent sweep)
缺点:
CMS收集器无法处理浮动垃圾( Floating Garbage) , 可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。 由于CMS并发清理阶段用户线程还在运行着, 伴随程序运行自然就还会有新的垃圾不断产生, 这一部分垃圾出现在标记过程之后, CMS无法在当次收集中处理掉它们, 只好留待下一次GC时再清理掉。 这一部分垃圾就称为“浮动垃圾”。 也是由于在垃圾收集阶段用户线程还需要运行, 那也就还需要预留有足够的内存空间给用户线程使用, 因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集, 需要预留一部分空间提供并发收集时的程序运作使用。可以适当调高参数-XX: CMSInitiatingOccupancyFraction的值来提高触发百分比, 以便降低内存回收次数从而获取更好的性能
CMS是一款基于“标记—清除”算法实现的收集器, 如果读者对前面这种算法介绍还有印象的话, 就可能想到这意味着收集结束时会有大量空间碎片产生。 空间碎片过多时, 将会给大对象分配带来很大麻烦, 往往会出现老年代还有很大空间剩余, 但是无法找到足够大的连续空间来分配当前对象, 不得不提前触发一次FullGC。 为了解决这个问题, CMS收集器提供了一个-XX: +UseCMSCompactAtFullCollection开关参数( 默认就是开启的) , 用于在CMS收集器顶不住要进行FullGC时开启内存碎片的合并整理过程, 内存整理的过程是无法并发的, 空间碎片问题没有了, 但停顿时间不得不变长。虚拟机设计者还提供了另外一个参数-XX:CMSFullGCsBeforeCompaction, 这个参数是用于设置执行多少次不压缩的Full GC后, 跟着来一次带压缩的
7. G1收集器
G1是一款面向服务端应用的垃圾收集器。基于“标记—整理”算法实现.并行。
降低停顿时间是G1和CMS共同的关注点, 但G1除了追求低停顿外, 还能建立可预测的停顿时间模型。
G1把内存“化整为零”。它将整个Java堆划分为多个大小相等的独立区域( Region) , 虽然还保留有新生代和老年代的概念, 但新生代和老年代不再是物理隔离的了, 它们都是一部分Region( 不需要连续) 的集合。G1收集器之所以能建立可预测的停顿时间模型, 是因为它可以有计划地避免在整个Java堆中进行全区域的垃圾收集。 G1跟踪各个Region里面的垃圾堆积的价值大小( 回收所获得的空间大小以及回收所需时间的经验值) , 在后台维护一个优先列表, 每次根据允许的收集时间, 优先回收价值最大的Region( 这也就是Garbage-First名称的来由) 。 这种使用Region划分内存空间以及有优先级的区域回收方式, 保证了G1收集器在有限的时间内可以获取尽可能高
的收集效率。
初始标记( Initial Marking)
并发标记( Concurrent Marking)
最终标记( Final Marking)
筛选回收( Live Data Counting and Evacuation)
8. 小总结
标签:收集,G1,标记,收集器,垃圾,CMS From: https://blog.51cto.com/u_15905340/5919358