JVM (三)- GC 垃圾回收器总结
GC 垃圾回收器
垃圾回收算法:
标记清除法:
从根节点开始标记所有可达对象,其余没标记的即为垃圾对象,执行清除。但回收后的空间是不连续的
标记整理(压缩):
适合用于老年代的算法(存活对象多于垃圾对象)。标记后不复制,而是将存活对象压缩到内存的一端,然后清理边界外的所有对象。
复制算法:
将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。(适用于新生代)
垃圾回收器:
CMS
Concurrent Mark-Sweep
老年代回收器
CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。
是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器
标记 - 清除垃圾算法实现 :
标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
Serial Old
CMS 的备选,Serial 垃圾回收器的老年版本,单线程
老年代回收器
标记 - 整理算法 进行垃圾回收:
标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
Parallel Old
Serial Old 的多线程版本, Prallel 的老生代版本;
老年代回收器
标记-整理的内存回收算法 :
标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
Serial
最早的单线程串行垃圾回收器
新生代回收器
复制算法 : 按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,
只有原来的一半。
ParNew
ParNew 是 Serail 的多线程版本
新生代回收器
复制算法 :
Parallel
和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。
G1
整堆回收器:
一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。
分代垃圾回收器
分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。
新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下
把 Eden + From Survivor 存活的对象放入 To Survivor 区;
清空 Eden 和 From Survivor 分区;
From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor
变 From Survivor。