JVM 经典垃圾收集器

本文部分摘自《深入理解 Java 虚拟机第三版》

概述

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者。Java 虚拟机规范中对垃圾收集器的实现做出规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器各有不同。所谓经典就是在 JDK7 Update 4 以后,JDK11 发布以前的在 OpenJDK HotSpot 虚拟机所包含的全部可用的垃圾收集器。尽管这些经典垃圾收集器已算不上最先进的技术,但它们都经历了千锤百炼,基本上都是可以放心使用的垃圾收集器。各款经典垃圾收集器之间的关系如图所示,如果两个收集器之间存在连线,就说明它们可以搭配使用:

Serial 收集器

Serial 收集器是最基础、历史最悠久的收集器,在 JDK3 以前是 HotSpot 虚拟机新生代收集器的唯一选择。这个收集器是一个单线程工作的收集器。这里的单线程不仅仅是说明它只使用一条收集线程去完成垃圾收集工作,更强调的是它在进行垃圾收集时,必须暂停其他所有工作线程,直至收集结束,也即“Stop The World”。这项工作是由虚拟机在后台自动发起和完成的,用户完全不可知,也不可控,显然这令人难以接受

但 Serial 收集器也有自己的优势,那就是简单与高效(与其他收集器的单线程相比)。对于内存有限的环境,它是所有收集器里额外内存消耗最小的;对于单核处理器或处理器核心数较少的环境,Serial 收集器由于没有线程交互的开销,可以专心做垃圾收集,自然可以获得最高的单线程收集效率。在用户桌面应用场景以及近年来流行的部分微服务应用,分配给虚拟机管理的内存一般不会太大,垃圾收集的停顿时间完全可以控制在毫秒级别,这点停顿时间对于用户来说完全可以接受。所以,Serial 收集器对于运行在客户端模式下的虚拟机是一个不错的选择

ParNew 收集器

ParNew 收集器实质上是 Serial 收集器的多线程并行版本,除了同时使用多条线程进行垃圾收集之外,其余的行为包括 Serial 收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial 收集器完全一致,在实现上这两种收集器也共用了许多代码

ParNew 收集器除了支持多线程并行收集外,其余与 Serial 收集器并无太多创新,但它却是不少运行在服务端的 HotSpot 虚拟机,尤其是 JDK7 之前的遗留系统首选的新生代收集器,其中最重要的原因是:除了 Serial 收集器,目前只有它能与 CMS 收集器配合工作。CMS 收集器是 HotSpot 虚拟机中第一款真正意义上支持并发的垃圾收集器,它首次实现了让垃圾收集器线程与用户线程(基本上)同时工作。不过由于 JDK9 以后 CMS 逐渐被 G1 所代替,ParNew 也渐渐退出了历史舞台

ParNew 收集器由于存在线程交互开销,当处于单核心处理器环境中时并不会有比 Serial 收集器更好的效果。不过,随着可以被使用的处理器核心数的增加,ParNew 对于垃圾收集时系统资源的高效利用还是很有好处的

Parallel Scavenge 收集器

Parallel Scavenge 收集器也是一款新生代收集器,它同样是基于标记 - 复制算法实现的收集器,也是能够并行收集的多线程收集器。不同于 CMS 等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,Parallel Scavenge 收集器的目标是达到一个控制的吞吐量。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值,即:吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 运行垃圾收集时间)

停顿时间越短,越适合需要与用户交互或需要保证服务响应质量的程序,提升用户体验;而高吞吐量则可以最高效率低利用处理器资源,尽快完成程序的运算任务。Parallel Scavenge 收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的 -XX:MaxGCPauseMillis 参数以及直接设置吞吐量大小的 -XX:GCTimeRatio 参数

除上述两个参数,Parallel Scavenge 收集器还有一个参数 -XX:UseAdaptiveSizePolicy,这是一个开关参数,当这个参数被激活后,就不需要人工指定新生代的大小(-Xmn)、Eden 与 Survivor 区的比例(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或最大1吞吐量,这种调节方式称为垃圾收集的自适应调节策略

Serial Old 收集器

Serial Old 收集器是 Serial 收集器的老年代版本,同样是一个单线程收集器,使用标记 - 整理算法。这个收集器的主要供客户端模式下的 HotSpot 虚拟机使用。如果用在服务端模式,可能有两种用途:一种是在 JDK5 及之前的版本中与 Parallel Scavenge 收集器搭配使用,另一种就是作为 CMS 收集器发生失败时的后备预案。Serial Old 收集器的工作过程如图所示:

Parallel Old 收集器

Parallel Old 是 Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,基于标记 - 整理算法实现。这个收集器直到 JDK6 时才开始提供,在此之前,新生代的 Parallel Scavenge 收集器一直处于相当尴尬的状态,因为如果新生代选择了 Parallel Scavenge 收集器,那么老年代除了 Serial Old 收集器以外就别无选择,效率不高。直到 Parallel Old 收集器的出现,吞吐量优先收集器终于有了比较名副其实的搭配组合。Parallel Old 收集器的工作过程如图所示:

(0)

相关推荐

  • JVM真香系列:图解垃圾回收器

    回复"000"获取大量电子书 不知不觉,JVM系列已经到回收算法的实现了. 本文主要内容 先普及三个概念: 并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态. 并 ...

  • Java虚拟机垃圾回收(三) 7种垃圾收集器

    主要特点 应用场景 设置参数 基本运行原理 在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java虚拟机垃圾回收(二) 垃圾回收算法>了解 ...

  • JVM调优之垃圾定位、垃圾回收算法、垃圾处理器对比

    谈垃圾回收器之前,要先讲讲垃圾回收算法,以及JVM对垃圾的认定策略,JVM垃圾回收器是垃圾回收算法的具体实现,了解了前面的前置知识,有利于对垃圾回收器的理解. 什么是垃圾? 垃圾,主要是指堆上的对象, ...

  • JVM总结

    JVM总结

  • 7种jvm垃圾回收器,这次全部搞懂

    前言 之前我们讲解了jvm的组成结构与垃圾回收算法等知识点,今天我们来讲讲jvm最重要的堆内存是如何使用垃圾回收器进行垃圾回收,并且如何使用命令去配置使用这些垃圾回收器. 堆内存详解 上面这个图大家应 ...

  • JVM 经典垃圾收集器 —— CMS 收集器和 G1 收集器

    本文部分摘自<深入理解 Java 虚拟机第三版> CMS 收集器 1. 概述 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.由于大部 ...

  • 经典重器,千年老料,一木一器,明式三围独板罗汉床

    一木一器 明式三围独板罗汉床 规格:203 *102 *80 cm 明式家具权威学者王世襄先生在<明式家具研究>中共举十例罗汉床,前两例皆为三屏风独板围子不加雕饰者.并指出:"独 ...

  • 紫砂壶经典传器系列《三十一》却月

    器型解读: 却月,辞典给出的解释是半圆的月亮.最初看到该词,武断地想象,可能古代"却"与"缺"通假,故"缺月"也可写作"却月&qu ...

  • 紫砂壶经典传器系列《二十七》汉方、四方、斗方

    器型解读: [汉方]是紫砂方器中的经典款式,据史料记载,明朝就有了汉方壶.被广泛制作是从清中期开始,盛行于乾隆年间,一直延续到清末民初,至今不衰. 明代周高起<阳羡茗壶系·雅流>记载:&q ...

  • 紫砂壶经典传器系列《二十六》宫灯

    器型解读: 伴吟月下,且启我心.宫灯在中国已有上千年的历史,为中国传统文化的一个符号.宫灯是悬挂在厅堂梁上的照明灯具,相传东汉光武帝刘秀统一天下建都洛阳后,为庆贺功业,在宫廷里张灯结彩.大摆宴席,盏盏 ...

  • 紫砂壶经典传器系列《二十五》竹节、 竹鼎、竹鼓

    壶型解读: 借物抒情是艺术创作的一个传统.宜兴的紫砂壶艺也是如此,只是生活在竹海里的艺人,把竹子引入壶艺创作比较晚罢了.我们曾为此写作过"迟来的竹节壶".从文献的记载看,葵花.菊花 ...

  • 紫砂壶经典传器系列《二十四》掇球

    壶型解读: 掇球作为紫砂经典器型之一,掇,落起来的意思:掇球,落起来的球.此型为邵大亨首创,由莲子大壶转变而来,去莲子把下耳. 掇球从一开始经历了三次历史性的演变,分别是大亨掇球.友廷掇球.寿珍掇球, ...

  • 紫砂壶经典传器系列《二十三》周盘

    壶型解读: 梅花周盘壶,自明代起就十分的流行,其经典造型深入人心,诸多紫砂艺人不断模仿.创作,使梅花周盘精彩纷呈. 梅花周盘属于筋纹器,形制取自梅瓣造型,是于梅花抽象中得灵感.从壶盖到壶身由六片筋纹一 ...

  • 紫砂壶经典传器系列《二十一》汉方

    清雍正-乾隆 惠逸公制朱砂泥小汉方 汉方壶是历史传统经典壶型.其造型可能是仿陶钫或青铜方壶而来.钫是西汉时流行的一种陶瓷明器,仿青铜式样,方腹外鼓,方顶盖.而汉方壶身造型正是高身方钟形,敛口.短颈,直 ...