java垃圾(三)——垃圾收集器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heuguangxu/article/details/80542098

    前一篇是垃圾收集算法,讲的是理论,垃圾收集器就是这些理论的具体实现。下面介绍一些垃圾收集器

Serial收集器

    串行收集器是高效率的、古老的收集器,它只用了一个线程去回收垃圾。新生代、老年代使用串行回收;新生代复制算法、老年代标记-压缩算法。串行是指GC过程和用户过程是串行的,在垃圾收集过程中会stop the world,JVM在后台自动发起垃圾回收,会在用户不可见的情况下,把用户的线程全部停掉,就是GC停顿,给用户带来不良体验。

红色代表GC线程,灰色代表用户线程,下同。

image

ParNew收集器

    ParNew收集器就是Serial收集器的多线程版本,除了多线程以外,其余行为都和Serial收集器一样。新生代并行收集,老年代串行收集;新生代使用复制算法、老年代使用标记-压缩算法。

image

Parallel Scavenge收集器

    Parallel Scavenge收集器类似于ParNew收集器,因为与吞吐量密切,也称为吞吐量收集器。可以通过参数来打开自适应调节策略,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大的吞吐量;也可以通过参数控制GC的时间不大于多少毫秒或者比例。Parallel Scavenge收集器以高吞吐量为目标,减少垃圾收集时间,让用户代码获得更长的运行时间;GC停顿时间的缩短,是用牺牲吞吐量和新生代空间来换取的。

Parallel Old收集器

    Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-压缩”算法,在JDK1.6版本才开始提供。

CMS收集器

    CMS(Concorrect mask sweep)收集器是一种以获取最短停顿时间为目标的收集器;也称为并发低停顿收集器。常用在WEB、B/S架构的服务系统中,因为这类应用很注重响应速度,尽可能减少系统停顿时间,给用户带来较好的体验。从名字上就可以看出来,它是基于“标记-清除”算法实现的,整个过程分为4步:

初始标记

    初始标记仅仅标记GC Roots能直接关联到的对象,所以速度很快,需要停止服务(Stop The World)

并发标记

    并发标记是进行GC Roots Tracing的过程,为了标记上一步集合中的存活对象,因为用户程序这段时间也在运行,所以并不能保证可以标记出所有的存活对象。

重新标记

    重新标记阶段是为了修正并发标记阶段因用户程序继续运作而导致标记变动的那一部分对象,采用多线程并行来提升效率,会停止服务,时间上远比并发标记短,较初始标记稍长。

并发清除

    这个阶段即并发收集垃圾对象,可以与用户线程一起工作。

    虽然CMS收集器线程可以和用户线程一起进行,但是它肯定会占用CPU资源,拖慢应用程序是肯定的,总的吞吐量会降低。

image

G1收集器

    (看下垃圾回收算法中的分区算法)这是目前最新的前沿成果,它基于“标记-压缩”算法,可以进行空间整理,不会产生碎片。前面的垃圾收集器,收集范围都是整个新生代或老年代,但是G1收集器不是这样,使用G1收集器时,java堆的内存模型不同,它还保留有新生代和老年代的概念,它们都是一部分区域(可以不连续)的集合。除此之外,G1收集器还能建立可预测的停顿时间模型,可以明确指定M毫秒时间片内,垃圾收集消耗的时间不超过N毫秒。G1跟踪各个区域(Region)获得其收集价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。G1垃圾回收也分4步:

初始标记

    仅标记GC Roots能直接关联到的对象。

并发标记

    进行GC Roots Tracing的过程,并不能保证可以标记出所有的存活对象。这个阶段若发现区域对象中的所有对象都是垃圾,那个这个区域会被立即回收。

最终标记

    为了修正并发标记期间因用户程序继续运作而导致标记变动的那一部分对象的标记记录,G1中采用了比CMS更快的初始快照算法:snapshot-at-the-beginning (SATB)。

筛选回收

    首先排序各个Region的回收价值和成本,然后根据用户期望的GC停顿时间来制定回收计划,最后按计划回收一些价值高的Region中垃圾对象,回收时采用”复制”算法,从一个或多个Region复制存活对象到堆上的另一个空的Region,并且在此过程中压缩和释放内存。

    对java垃圾回收的理解粗略就这三篇,重点应该了解下G1收集器吧,再深入的就要看书学习啦。

猜你喜欢

转载自blog.csdn.net/heuguangxu/article/details/80542098