首页 > 编程语言 >《深入理解Java虚拟机》读书笔记:垃圾收集器

《深入理解Java虚拟机》读书笔记:垃圾收集器

时间:2023-08-12 20:11:47浏览次数:42  
标签:G1 收集器 虚拟机 标记 读书笔记 线程 Serial CMS

垃圾收集器

 

HotSpot虚拟机包含的所有收集器如图3-5所示。图3-5展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。

新生代收集器:Serial、ParNew、Parallel Scavenge,新生代收集器均采用复制算法

老年代收集器:Serial Old(标记-整理算法)、Parallel Old(标记-整理算法)、CMS(标记-清除算法)

不分代的收集器:G1(整体来看基于标记-整理和局部来看基于复制算法)

图3-5 HotSpot虚拟机的垃圾收集器

一、Serial收集器

Serial收集器是一个单线程的收集器,它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。这个过程常被称为“Stop The World”。

实际上到现在为止,它依然是虚拟机运行在Client模式下的默认新生代收集器。它也有着优于其他收集器的地方:简单而高效(与其他收集器的单线程比),对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。

图3-6 Serial/Serial Old收集器运行示意图

二、 ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数、收集算法、Stop The World、对象分配规则、回收策略等都与Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。ParNew收集器的工作过程如图3-7所示。

它是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合工作。

图3-7 ParNew/Serial Old收集器运行示意图

三、Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器……看上去和ParNew都一样,那它有什么特别之处呢?Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量 = 运行用户代码时间 /(运行用户代码时间 +垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

 

四 、Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整理”算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。如果在Server模式下,那么它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。这两点都将在后面的内容中详细讲解。Serial Old收集器的工作过程如图3-8所示。

图3-8 Serial/Serial Old收集器运行示意图

 

五、Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。直到Parallel Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的应用组合,在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器。Parallel Old收集器的工作过程如图3-9所示。

图3-9 Parallel Scavenge/Parallel Old收集器运行示意图

 

六、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它在垃圾收集时使得用户线程和GC线程并发执行,因此在GC过程中用户也不会感受到明显卡顿.但用户线程和GC线程之间不停地切换会有额外的开销,因此垃圾回收总时间就会被延长。CMS收集器是基于“标记—清除”算法实现的。

1、运行过程

它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:

(1)初始标记(CMS initial mark)

(2)并发标记(CMS concurrent mark)

(3)重新标记(CMS remark)

(4)并发清除(CMS concurrent sweep)

其中,初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。

由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。通过图3-10可以比较清楚地看到CMS收集器的运作步骤中并发和需要停顿的时间。

图3-10 Concurrent Mark Sweep收集器运行示意图

2、CMS的缺点

CMS有以下3个明显的缺点:

(1)CMS收集器对CPU资源非常敏感。

当CPU不足4个(譬如2个)时,CMS对用户程序的影响就可能变得很大,如果本来CPU负载就比较大,还分出一半的运算能力去执行收集器线程,就可能导致用户程序的执行速度忽然降低了50%,其实也让人无法接受。

(2)CMS收集器无法处理浮动垃圾

由于垃圾清除过程中,用户线程和GC线程并发执行,也就是用户线程仍在执行,那么在执行过程中会产生垃圾,这些垃圾称为"浮动垃圾".

(3)会产生大量碎片空间

CMS是一款基于“标记—清除”算法实现的收集器,收集结束时会有大量空间碎片产生。

(4)吞吐量低

由于CMS在垃圾收集过程使用用户线程和GC线程并行执行,从而线程切换会有额外开销,因此CPU吞吐量就不如在GC过程中停止一切用户线程的方式来的高。

 

七、G1收集器

1、G1收集器概述

G1(Garbage-First)收集器,追求停顿时间、多线程GC、面向服务端应用。整体来看基于标记-整理和局部来看基于复制算法合并。

它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。

G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也就是Garbage-First名称的来由)。

 

2、G1的特点。

(1)并行与并发

G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿的时间,部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让Java程序继续执行。

(2)分代收集

与其他收集器一样,分代概念在G1中依然得以保留。虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但它能够采用不同的方式去处理新创建的对象和已经存活了一段时间、熬过多次GC的旧对象以获取更好的收集效果。

(3)空间整合

与CMS的“标记—清理”算法不同,G1从整体来看是基于“标记—整理”算法实现的收集器,从局部(两个Region之间)上来看是基于“复制”算法实现的,但无论如何,这两种算法都意味着G1运作期间不会产生内存空间碎片,收集后能提供规整的可用内存。这种特性有利于程序长时间运行,分配大对象时不会因为无法找到连续内存空间而提前触发下一次GC。

(4)可预测的停顿

这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒,这几乎已经是实时Java(RTSJ)的垃圾收集器的特征了。

 

3、G1收集器的运行过程

G1收集器的运作大致可划分为以下几个步骤:

(1)初始标记(Initial Marking)

(2)并发标记(Concurrent Marking)

(3)最终标记(Final Marking)

(4)筛选回收(Live Data Counting and Evacuation)

标签:G1,收集器,虚拟机,标记,读书笔记,线程,Serial,CMS
From: https://www.cnblogs.com/fhey/p/17625390.html

相关文章

  • VMware中的虚拟机Debian10的服务器配置,使主机(win10)能够通过本地域名(如www.xxx.com)
    VMware中的虚拟机Debian10的服务器配置,使主机(win10)能够通过本地域名(如www.xxx.com)访问该服务器安装过程下载debian-10.13.0-amd64-DVD-1.iso(可选下载链接:Indexof/cdimage/archive(debian.org))在VMware中安装虚拟机这里点击浏览,选择下载好的镜像文件,然后......
  • 《CUDA编程:基础与实践》读书笔记(5):统一内存编程
    统一内存(unifiedmemory)是一种逻辑上的概念,它既不是显存、也不是主机内存,而是CPU和GPU都可以访问并能保证一致性的虚拟存储器。使用统一内存对硬件有较高的要求:对于所有功能,GPU架构都必须不低于Kepler架构,主机应用程序必须为64位。对于一些较新的功能,至少需要Pascal架构的GPU......
  • JVM垃圾收集器
    一、垃圾回收器总览垃圾收集可以划分为几个阶段。。第一阶段:单线程收集时代(Serial和SerialOld)第二阶段:多线程收集时代(ParallelScanvenge和ParallelOld)第三阶段:并发收集时代(ParNew和CMS)第四阶段:智能并发收集时代(G1)下面的图一方面介绍了有哪些垃圾收集器,另外一方面也描述了每个垃......
  • 《CUDA编程:基础与实践》读书笔记(4):CUDA流
    1.CUDA流一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列。除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者。一个CUDA流中的各个操作按照主机发布的次序执行;但来自两个不同CUDA流的操作不一定按照某个次序执行,有可能是并发或者交错地执行。任何CUDA操作......
  • 《深入理解Java虚拟机》读书笔记:垃圾收集算法
    由于垃圾收集算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此本节不打算过多地讨论算法的实现,只是介绍几种算法的思想及其发展过程。垃圾收集算法概要 1、标记-清除算法标记-清除算法最基础的收集算法是“标记-清除”(Mark-Sweep)算法,算法分......
  • 虚拟机linux磁盘空间扩展
    1.打开虚拟机-编辑虚拟机设置-硬盘-扩展,增加磁盘大小,这里是40G   2.使用u盘启动,使用扩展工具扩展内存 4.重装系统......
  • 使用 Kafka Tools(现已更名为 Offeset Exploer)无法连接虚拟机的 Kafka 集群,报错error c
    发生缘由学习Kafka的使用,结果发现使用KafkaTools(现已更名为OffesetExploer)无法连接虚拟机的Kafka集群,报错信息:errorconnectingtothecluster.unabletoconnecttozookeeperserverxxx.xxx.xxx.xxx2181withtimeoutof10000ms运行环境电脑系统版本:Windows1......
  • 分布理论读书笔记三:Fourier变换
    5.\(\mathscr{S}\)上的傅里叶变换5.1.Schwartz函数空间\(\mathscr{S}(\mathbb{R}^n)\).定义1:设\(\varphi\inC^{\infty}(\mathbb{R}^n)\),如果对任意非负多重指标\(\alpha,p\)都有:\[\lim_{|x|\to\infty}|x^{\alpha}\partial^p\varphi|=0\qquad(eq1)\]在\(\mathbb{R}......
  • 分布理论读书笔记四:基本解
    基本解定义定义1:考虑常系数的偏微分算子:\[P(\partial)=\sum_{|\alpha|\lem}a_{\alpha}\partial^{\alpha}\]其中\(a_{\alpha}\)是常数.如果存在分布\(E\in\mathscr{D}'(\mathbb{R}^n)\),使得:\[PE=\delta(\mathscr{D}')\]则称\(E\)是偏微分算子\(P(\partial)\)的基本解.......
  • 分布理论读书笔记:习题和例子
    1:\(\mathrm{pv}(\frac{1}{x})\)考虑函数\(\frac{1}{x}\),由于\(f(x)\)在0点处的奇异性导致它并不是\(\mathbb{R}\)上的局部可积函数,可以直接验证,它并不是\(\mathbb{R}\)上的一个分布,但是,如果考虑如下的算子:定义:对任意的\(\varphi(x)\in\mathscr{D}\),定义算子:\[\mat......