JVM——垃圾收集器总结垃圾收集器概览
收集算法是内存回收的方法论,垃圾收集据是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有规定,不同的厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,一般都会提供参数供用户根据自己的所用特点和要求组合出各个年代所使用的收集器。下面是基于JDK 1.7 Update 14
垃圾收集器概览图如下:
Serial收集器
ClientSerial
运行示意图如下:
ParNew收集器
Stop The WorldCMSCPUCPU
垃圾收集的上下文语境中:
:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序继续运行,垃圾收集程序运行在另一个CPU上。
Parallel Scavenge收集器
CPU
Serial Old收集器
ClientJDK 5CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure的时候使用。
运行示意图如下:
Parallel Old收集器
运行示意图如下:
CMS收集器
。停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。目前很大一部分的JavaCMS收集器就非常符合这类应用的需求。
Stop The WorldGC Roots能直接关联到的对象,速度很快。
并发标记(CMS concurrent mark):并发标记阶段就是进行GCRoots Tracing的过程
Stop The World
并发清除(CMS concurrent sweep):进行垃圾清理工作。
运行示意图如下:
优点:并发收集、低停顿。
缺点:
CMS3)/ 4。
Floating GarbageCMSCMSCMSCMS运行期间预留的内存无偿满足程序需要,就会出现一次“Concurrent Mode Failure
收集结束时会产生大量空间碎片。CMS基于“标记一清除”算法实现。多次垃圾收集后,空间碎片过多,给大对象分配带来很大的麻烦,往往会出现老年代还有很大的空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GCCMSCMS收集器要进行FullGC时开启内存碎片整理。默认值为0,表示每次进入FullGC时都进行碎片整理
G1收集器
收集器技术发展的最新成果,是面向服务端应用的垃圾回收器。它有下面的特点:
并发与并行:能利用多CPU、多核环境下优势,,使用多个CPU (CPUJavaG1
RegionGI1GC。
N毫秒。
Java堆划分为多个大小相等的独立区域(Region),虽然保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离,它们都是一部分Region(不需要连续)的集合。
RegionRegion划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高的收集效率。
RegionRemembered Set来避免全堆扫描。
GI收集器的运作可划分为以下四个步骤:
肯承认错误则错已改了一半