目录
ParNew(parallel new的缩写) 年轻代 配合CMS的并行回收
CMS ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时进行,降低STW的时间(200ms)
新生代+老年代+元数据区:永久代(1.7)/元数据区(1.8)(metaspace)
常见的垃圾回收器(背)
jdk诞生时,使用的是serial,为了提高效率,诞生了PS,为了配合CMS(1.4版本后期引用,里程碑式,开启了并发回收:垃圾回收进程和工作进程同时进行),又诞生了PN。但是CMS问题很多,所以默认都不是CMS。
并发垃圾回收器是因为无法忍受STW
PS是并行,多个gc线程同时执行。
CMS是并发,在gc执行的时候,工作线程可以产生新垃圾
-
serial 年轻代 串行回收
-
单线程的GC thread
-
当Serial工作时,所有的线程都到safe point点时停止(STW. stop the world)。单CPU效率最高
-
-
PS 年轻代 并行回收
-
多线程的GC thread
-
也是所有线程到safe point点停止工作
-
用的是compacting算法
-
-
ParNew(parallel new的缩写) 年轻代 配合CMS的并行回收
-
同PS:多线程,STW,
-
不同:做了一些增加,为了和CMS配合使用
-
-
SerialOld
-
单线程的GC thread。
-
用的是mark-sweep-compact算法
-
-
ParallelOld
-
CMS ConcurrentMarkSweep 老年代 并发的,垃圾回收和应用程序同时进行,降低STW的时间(200ms)
-
并发标记算法:三色标记+ incremental update
-
concurrent mark sweep 并发标记清除
-
过程:
-
先初始标记,STW,但是此时只标记根的较少的对象,所以很多
-
并发标记,耗费80%的时间,所以工作线程此时可以并发进行
-
重新标记,stw,因为并发标记阶段可能会漏,所以此时再标记一次
-
并发清理。此时产生的垃圾叫做 浮动垃圾,这些垃圾只能等着下次CMS才能清理
-
-
CMS问题比较多,所以现在没有一个版本默认是CMS,只能手工指定。CMS既然是MarkSweep,就一定会有碎片化的问题,碎片到达一定程序,CMS的老年代分配对象分配不下的时候,使用SerialOld进行老年代回收。想象一下:PS+PO->加内存 换垃圾回收器-> PN+CMS+SerialOld(几个小时-几天的STW)。几十个G的内存,单线程回收->G1+FGC 几十个G->上T内存的服务器ZGC
-
CMS的2大问题
-
Memory Fragmentation 内存碎片化
-
-XX:+UseCMSComp
-
-
-