JVM GC算法总结
串行gc
-年轻代收集器serial,使用 mark-copy(标记-复制) 算法;老年代收集器serial old,使用mark-sweep-compact(标记-清除-整理)算法。
-Yong GC全过程STW,Full GC全过程STW。(全部gc STW)
-不管有多少 CPU 内核,JVM 在垃圾收集时都只能使用单个核心。CPU 利用率高,暂停时间长,该gc只适合几百 MB 堆内存的 JVM,而且是单核 CPU 时比较有用
并行gc
-年轻代收集器parallel scanvenge,使用mark-copy(标记-复制)算法;老年代收集器parallel old,使用mark-sweep
compact(标记-清除-整理)算法。
-Yong GC全过程STW,Full GC全过程STW。(全部gc STW)
-适用于多核服务器,主要目标是增加吞吐量。因为对系统资源的有效使用,能达到更高的吞吐量。
-由于gc会stw,适当提高xmx与xms能减少gc发生的频率,但单次gc暂停的时间会增大,系统的吞吐量增加的同时也会增加系统的延迟。
CMS GC
-年轻代收集器ParNew,使用并行mark-copy(标记-复制)算法;老年代收集器CMS,使用并发 mark-sweep (标记-清除)算法。
-Yong GC全过程STW,Old GC只有初始标记与最终标记过程STW,其余过程并发进行,业务线程不暂停。Full GC全过程STW。
-如果服务器是多核 CPU,并且主要调优目标是降低 GC 停顿导致的系统延迟,那么使用 CMS 是个很明智的选择。进行老年代的并发回收时,可能会伴随着多次年轻代的 minor GC(yong gc)。降低延迟。
-cms gc的六个阶段:1、Initial Mark(初始标记)2、Concurrent Mark(并发标记)3、Concurrent Preclean(并发预清理)4、Final Remark(最终标记)5、 Concurrent Sweep(并发清除)6、Concurrent Reset(并发重置)
-缺点:cms gc不压缩导致老年代内存碎片问题,在某些情况下 GC会造成不可预测的暂停时间,特别是堆内存较大的情况下。
G1 GC
-堆不再分成年轻代和老年代,而是划分为多个可以存放对象的小块堆区域,每个小块,可能一会被定义成 Eden 区,一会被指定为 Survivor区或者Old 区。使用标记-清除+复制(mark-sweep+mark-copy)算法。
-转移暂停:年轻代模式((G1 Evacuation Pause) (young),前面介绍的其他年轻代收集器是一样的工作原理)全过程STW;转移暂停::混合模式(Evacuation Pause (mixed))初始标记与再次标记过程STW,其余过程并发进行。
-G1 GC处理步骤:一、转移暂停:年轻代模式 二、并发标记(1、Initial Mark(初始标记)2、Root Region Scan(Root区扫描)3、Concurrent Mark(并发标记)4、Remark(再次标记)5、Cleanup(清理))三、转移暂停: 混合模式
-每次只处理一部分内存块,称为此次 GC 的回收集(collection set)。每次 GC 暂停都会收集所有年轻代的内存块,但一般只包含部分老年代的内存块。在并发阶段估算每个小堆块存活对象的总数。构建回收集的原则是: 垃圾最多的小块会被优先收集。降低延迟。
-某些情况下 G1 触发了 Full GC,这时 G1 会退化使用 Serial 收集器来完成垃圾的清理工作,它仅仅使用单线程来完成 GC 工作。退化原因:1、并发模式失败,G1 启动标记周期,但在 Mix GC 之前,老年代就被填满,这时候 G1 会放弃标记周期。 2、晋升失败 ,没有足够的内存供存活对象或晋升对象使用,由此触发了 Full GC(to-space exhausted/to-space overflow)3、巨型对象分配失败,当巨型对象找不到合适的空间进行分配时,就会启动 Full GC,来释放空间
GC 使用推荐原则:
-
如果系统考虑吞吐优先,CPU 资源都用来最大程度处理业务,用 Parallel GC;
-
如果系统考虑低延迟有限,每次 GC 时间尽量短,用 CMS GC;
-
如果系统内存堆较大,同时希望整体来看平均 GC 时间可控,使用 G1 GC。
对于内存大小的考量:
-
一般 4G 以上,算是比较大,用 G1 的性价比较高。
-
一般超过 8G,比如 16G-64G 内存,非常推荐使用 G1 GC。