JVM
之垃圾回收器学习(一)
概念
- 并行收集:多条垃圾收集线程并行工作,用户线程处于等待状态。
- 并发收集:用户线程与垃圾收集线程同时工作(单
cpu
的话就是交替执行)。 - 吞吐量:
CPU
用于运行用户代码的时间与CPU
总消耗时间的比值(吞吐量=运行用户代码时间/(总时间)),例如虚拟机运行100分钟,垃圾回收占用1分钟,那么吞吐量就是99%。 - 垃圾收集开销:吞吐量的补数,垃圾收集器所占时间与总时间的比例。
- 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
- 收集频率:相对于应用程序的执行,收集操作发生的频率。
Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
- 优点:简单高效,拥有很高的单线程收集效率
- 缺点:垃圾回收期间需要暂停所有线程,
STW
:体验差。 - 算法:年轻代用复制算法,老年代使用标记整理算法。
- 应用场景:应用于小的存储器和单核
CPU
。
Serial(串行)收集器是最基本的、历史最悠久的垃圾收集器。它的单线程意义不仅仅意味着
它只会使用一条垃圾收集线程去完成垃圾回收工具。更重要的是它在进行垃圾收集工作的时候
必须暂停其它所有的工作线程,直到它收集完成。
Parallel Scavenge收集器(-XX:+UseParallelGC,XX:+UseParallelOldGC)
-
优点:吞吐量高
-
缺点:体验差,有
STW
-
算法:新生代采用复制算法,老年代采用标记整理算法
-
参数
-
-XX:GCTimeRatio
:设置GC
的执行频率。 -
-XX:MaxGCPauseMills
:设置STW
机制的暂停时间阈值。 -
-XX:UseAdaptiveSizePolicy
:GC
自适应策略开关,开启后,年轻代Eden和Survivor的比例、晋升老年代的年龄等参数会自动调整。 -
-XX:ParallelGCThreads
:设置垃圾回收时线程的数量。当cpu
数量小于8个,ParallelGCThreads
的值等于cpu
数量。当cpu
数目大于8个的时候,ParallelGCThreads
的值设置为3+[5*cpu_count]/8
。
parallel其实就是serial收集器的多线程版本,默认收集线程数跟cpu一样,使用标记整理算法, JDK8默认使用该收集器,垃圾回收过程会集中回收垃圾,会stw,与cms有很大区别。
ParNew
收集器(-XX:+UseParNewGC)
-
-
优点:并行垃圾收集,多线程收集垃圾,效率高。可以与
CMS
收集器配合使用。 -
缺点:体验差,会
STW
。如果是单核CPU
Serial收集器更佳。 -
算法:复制算法。
CMS
收集器(-XX:+UseConcMarkSweepGC(old))
- 优点:
STW
时间段,体验好。只有初始标记和重新标记会发生stw
。 - 算法:标记-清除算法
- 缺点:由于采用标记-清除算法,可能会导致大量的内存碎片,不过可以通过参数开启内存碎片的合并整理。
CMS
只能与Serial
和ParNew
配合使用。
- 初始标记:暂停所有的其它线程(
STW
),并记录下gc roots
直接能引用的对象,速度很快。- 并发标记:占80%时间。 并发标记阶段就是从
GC Roots
的直接关联对象开始遍历整个对象图的过程。这个过程很长但不需要停顿用户线程,可以与垃圾收集线程一起并发运行。因为用户程序继续运行,可能会有可能导致已经标记过的对象状态发生改变。- 重新标记:重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分。
- 并发清理:开启用户线程,同时
GC
线程开始对未标记的区域做清除。- 并发重置:重置本次
GC
过程种的标记数据。
CMS收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,
它是HotSpot虚拟机第一款真正意义上的并发收集器。它地磁实现了让垃圾收集线程与用户线程(基本
上)同时工作。
评论区