JVM中的垃圾收集器
Posted DroidMind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM中的垃圾收集器相关的知识,希望对你有一定的参考价值。
下面这些收集器在新生代中使用:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseParNewGC
下面这些收集器在老年代中使用:
-XX:+UseParallelOldGC
-XX:+UseConcMarkSweepGC
Serial收集器
1、使用在新生代,使用复制算法
2、它是一个单线程收集器,也就是它只会使用一个CPU或一个收集线程去完成垃圾收集工作。
3、它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
ParNew收集器
1、使用在新生代,使用复制算法
2、它就是Serial收集器的多线程版本
Parallel收集器
1、新生代垃圾收集器,同样使用复制算法
2、并行多线程收集,这个跟ParNew收集器基本一致
3、特点(与ParNew收集器的不同点):其他收集器像CMS都是为了尽可能缩短垃圾收集时用户线程的停顿时间,Parallel收集器的目标是为了达到一个可控的吞吐量,吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
4、无法与CMS收集器配合使用
Serial Old收集器
1、使用在老年代,使用标记-整理算法
2、单线程收集器
3、它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
Parallel Old收集器
1、使用在老年代,使用标记-整理算法
2、并行多线程收集器
3、特点跟Parallel收集器相同
4、在注重吞吐量的场合,可以考虑使用Parallel收集器+Parallel Old收集器的组合,一个在新生代,一个在老年代。
CMS(Concurrent Mark-Sweep Collector, 并发标记-清除)收集器
1、是一种以获取最短回收停顿时间为目标的收集器
2、使用在老年代,使用标记-清除算法
整个过程分为4个步骤:
初始标记
并发标记
重新标记
并发清除
其中,初始标记、重新标记仍然需要Stop The World,初始标记仅仅只是标记了GC Root能直接关联的对象,速度很快,并发标记就是进行GC Roots Tracing的过程。而重新标记是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般比初始标记阶段稍微长一些,但是远比并发标记的时间短。由于整个过程中耗时最长的并发标记和清除标记过程都可以与用户线程一起工作,所以总体来看,CMS收集器的内存回收过程是跟用户线程一起并发执行的。
缺点:
1、CMS对CPU资源非常敏感,这个其实毋庸置疑,在并发操作中,虽然不会导致用户线程停顿,但是会因为占用了一部分CPU资源而导致应用程序变慢。
2、无法处理浮动垃圾,因为CMS清理阶段与用户线程是并行的,所以在清理的过程中也会新的垃圾产生,这部分垃圾出现在标记之后,所以只能下一次GC时进行处理,这部分垃圾就是"浮动垃圾"。
3、因为CMS采用的是标记-清除算法,所以容易产生内存碎片。
Serial和Parallel收集器的区别?
它们在GC的过程中都会导致stop-the-world
serial收集器只有一个GC线程,默认使用复制算法进行收集。
parallel收集器使用多线程进行GC操作。
Parallel和CMS收集器的区别?
1、parallel使用多线程进行GC操作,但是CMS只有一个GC线程
2、parallel是一个stop-the-world收集器,CMS只有在初始标记和重新标记阶段是stop-the-world,在并发标记和并发清除阶段都是伴随着用户线程的执行。
如果希望在GC中结合并行和并发,可以使用-XX:UserParNewGC和-XX:+UseConcMarkSweepGC结合。
G1 (Garbage-First)收集器
上一代的垃圾收集器(串行serial, 并行parallel, 以及CMS)都把堆内存划分为固定大小的三个部分: 年轻代(young generation), 年老代(old generation), 以及持久代(permanent generation).
而 G1 收集器采用一种不同的方式来管理堆内存.
在G1中,堆被划分成 许多个连续的区域(region)。每个区域大小相等,在1M~32M之间。JVM最多支持2000个区域,可推算G1能支持的最大内存为2000*32M=62.5G。区域(region)的大小在JVM初始化的时候决定,也可以用-XX:G1HeapReginSize设置。实际上,这些区域(regions)被映射为逻辑上的 Eden, Survivor, 和 old generation(老年代)空间.
图中的颜色标识了每一个区域属于哪个角色. 当进行GC时,存活的对象从一块区域复制到另一块区域。设计成这种区域的目的是为了并行地进行垃圾回收。
G1中每个区域都有一个与之对应的Remembered Set,它用来存放对应区域内的对象引用,能够使区域之间并行的进行垃圾收集。
收集过程:
初始标记
并发标记
最终标记
筛选回收
跟CMS有很多相似之处,标记阶段仅仅只是标记一下GC Roots能直接关联到的对象,这个阶段需要停顿线程,但是耗时较短。
并发标记阶段是从GC Root开始对堆中对象进行可达性分析,找到存活的对象,这阶段耗时较长,但是可与用户程序并发执行。而最终标记则是为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,这个阶段需要停顿线程,可以多线程并行执行。最后筛选回收阶段首先对各个区域的回收价值和回收成本进行排序,进行用户所期待的GC停顿时间来制定回收计划。
以上是关于JVM中的垃圾收集器的主要内容,如果未能解决你的问题,请参考以下文章