系列文章目录
1:JVM核心知识
2.GC算法
2.1:GC的背景与一般原理
2.2:串行 GC/并行 GC
目录
前言
本系列主要针对想进一步进阶Java的开发者,本文介绍串行GC与并行GC
一、什么是串行GC,怎么配置呢?
串行 GC 对年轻代使用 mark-copy(标记-复制) 算法,对老年代使用 mark-sweep-compact(标记-清除-整理)算法。
注意此处的标记-复制是指在年轻代中,我们根据GCroots做一次标记后,直接复制到另外一个存活区就好了,不需要整理,因为年轻代的一次GC不是原地进行的。
而老年代的GC是在原地进行的,标记-清除-整理代表我们在对老年代进行标记清除后,会产生内存碎片,我们需要整理这些内存碎片。
-XX:+UseSerialGC 配置串行 GC
二、串行GC的特点与适用的场景
1.串行GC的特点
前面已经说过串行GC的年轻代和老年代每次GC时的处理略微有点不同。
两者都是单线程的垃圾收集器,不能进行并行处理,所以都会触发全线暂停(STW),停止所有的应用线程。
2.适用的场景
这种 GC 算法不能充分利用多核 CPU。不管有多少 CPU 内核,JVM 在垃圾收集时都只能使用单个核心。 CPU 利用率高,暂停时间长。简单粗暴,就像老式的电脑,动不动就卡死。 该选项只适合几百 MB 堆内存的 JVM,而且是单核 CPU 时比较有用。
如果堆内存比较大的话,能存储的对象就会变多,这时候做GC会暂停很长的时间,非常不适合线上业务的进行
串行GC是最早的一批GC,有其独特的历史意义,有了这第一个GC算法,后面的GC算法才得以产生。
三、并行GC
前面我们了解了串行GC无法利用我们的多核CPU,这在现代是无法接受的,那么有没有能利用多核的CPU呢?答案就是我们的并行GC。
并行GC的启动参数有两个:
-XX:+UseParallelGC
-XX:+UseParallelOldGC
并行GC和串行GC的算法原理基本类似,最大的区别是并行GC能用上多核来提升GC效率,能达到系统最大的吞吐量。
主要体现在这两点:
• 在 GC 期间,所有 CPU 内核都在并行清理垃圾,所以总暂停时间更短;
• 在两次 GC 周期的间隔期,没有 GC 线程在运行,不会消耗任何系统资源
我们能通过-XX:ParallelGCThreads=N 来指定 GC 线程数, 其默认值为 CPU 核心数。
可以看出并行GC在STW期间会把所有业务线程挂起,去做GC,这会带来吞吐量的提升,但是业务上会有一点延迟。
总结
以上就是今天要讲的内容,本文介绍了串行GC与并行GC,有没有一种能够不那么极端,在GC过程中,还会有线程去做业务相关的逻辑的呢,答案是有。接下来我们将介绍CMS GC/G1 GC,敬请期待。