深入理解Java虚拟机:Java垃圾回收器_java设置垃圾回收器-程序员宅基地

技术标签: JVM  Java  Java基础  CMS  G1  

本篇内容包括:7 种 Jvm 垃圾回收器的介绍、对比 以及 对应的 Jvm 参数设置,这 7 种包括了:Serial、ParNew 以及 Parallel Scavenge 三种新生代回收器 和 :Serial Old、Parallel Old 以及 CMS 三种老年代回收器,此外还有一个 G1 回收器是 Java 目前比较前沿的成果…

一、Jvm 垃圾回收器概述

我们前面提到了,垃圾回收器的 回收的内容、回收的时机以及回收的方式,接下来我们来看 Java 垃圾回收器。如果垃圾回收算法是内存回收的方法论的话,那么垃圾回收器就是内存回收的具体实现了。

Jvm 的垃圾回收器根据场景和实现方式可以分为新生代回收器和老年代回收器,新生代回收器与老年代回收器可以搭配使用。

  • 新生代回收器包括:Serial、ParNew 以及 Parallel Scavenge;
  • 老年代回收器包括:Serial Old、Parallel Old 以及 CMS;
  • 此外,Java7 update 4(第七版第四个更新升级包)之后引入了一个 G1 收集器。

Ps:不同垃圾回收器适合于不同的内存区域,有的两个垃圾回收器之间也可以配合使用!

在这里插入图片描述


二、新生代回收器

1、Serial 收集器

Serial 收集器是最基础且历史最悠久的垃圾收集器,作为单线程工作的收集器。Serial 会在它工作时要求暂停用户所有的其他线程(Stop-the-World 机制)。采用的是 “标记-复制” 算法。垃圾清理时,Serial 回收器不存在线程间的切换,因此,在单 CPU 的环境下,垃圾清除效率比较高。

Serial / Serial Old收集器运行示意图

虽然 Serial 收集器是最基础最老的收集器,但是迄今为止 HotSpot 虚拟机运行在 Client 模式下的默认的新生代垃圾收集器!相较于其他收集器,Serial 具有以下 3 个优点:

  1. 简单高效;
  2. 所有收集器中额外内存消耗最少;
  3. 针对内存几十兆或一两百兆的新生代,停顿时间能控制在一百毫秒内。

Ps:这里需要注意的一点是 Serial 收集器和 Serial Old 收集器在垃圾收集时不是单线程的,通常所描述的"单线程"是指的垃圾回收时暂停其他所有的工作线程。

2、ParNew 收集器

ParNew 收集器大致可以理解为是 Serial 收集器的多线程版本,因为 ParNew 收集器除了采用并行回收的方式执行内存回收外,与 Serial 收集器之间几乎没有任何区别。ParNew 收集器在年轻代中同样也是采用复制算法、Stop-the-World 机制。

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

ParNew 收集器是很多版本 Jvm(包括 HotSpot)运行在 Server 模式下新生代的默认垃圾收集器。

ParNew 收集器运行在多 CPU 的环境下,由于可以充分利用多 CPU、多核心等物理硬件资源优势,可以更快的完成垃圾收集,提升程序的吞吐量。但是在单个 CPU 的环境下,ParNew 收集器不比 Serial 收集器更高效,虽然 Serial 收集器是基于串行回收,但是由于 CPU不需要频繁的切换,因此可以有效避免多线程交互过程中产生的一些额外开销。

Ps:除了 Serial 外,目前只有 ParNew GC 能与 CMS 收集器配合工作。

3、Parallel Scavenge 收集器

Parallel Scavenge 收集器同 ParNew 收集器一样,也是采用 “标记-复制” 算法,且为能够并行收集的多线程收集器。

Parallel Scavenge 的特点是其关注重点为吞吐量,高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算,但也就是说它的线程单次停止时间可能更长,因此适用于后台计算型任务程序:Parallel Scavenge /Parallel Old收集器运行示意图

Ps:如果虚拟机完成某个任务,用户代码加上垃圾收集总共耗费了 100 分钟,其中垃圾收集花掉 1 分 钟,那吞吐量就是 99% :
吞吐量 = 运行用户代码时间 / 运行用户代码时间 + 运行垃圾回收时间 吞吐量=运行用户代码时间/运行用户代码时间+运行垃圾回收时间 吞吐量=运行用户代码时间/运行用户代码时间+运行垃圾回收时间


三、老年代回收器

1、Serial Old 收集器

Serial Old 是 Serial 收集器的老年代版本,采用“标记-整理”算法,单线程收集器,也是给 Client 模式下的虚拟机使用。

Serial / Serial Old收集器运行示意图

Ps:在 Jdk1.5 及其以前,它常与 Parallel Scavenge 回收器配合使用,达到较好的吞吐量,另外它也是 CMS 回收器在 Concurrent Mode Failure 时的后备方案。

2、Parallel Old 收集器

Parallel Old 回收器是 Parallel Scavenge 回收器的老生代版本,属于多线程回收器,采用“标记-整理”算法。Parallel Old 回收器和 Parallel Scavenge 回收器同样考虑了吞吐量优先这一指标,非常适合那些注重吞吐量和 CPU 资源敏感的场合。

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

Ps:在注重吞吐量以及 CPU 资源敏感的场合,可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器

3、CMS 收集器

CMS 收集器,是一种以获取最短回收停顿时间为目标的收集器,其缩写含义为 Concurrent Mark Sweep,Mark Sweep 指的是“标记-清除”算法,在互联网网站、B/S 架构的中常用的收集器就是 CMS,因为系统停顿的时间最短,给用户带来较好的体验。

CMS 收集器运行示意图

CMS收集器的运作过程分为4个步骤,包括:

  • 初始标记(短暂),仅仅只是标记一下 GCRoots 能直接关联到的对象,速度很快;
  • 并发标记(和用户的应用程序同时进行),进行 GCRoots 追踪的过程,标记从 GCRoots 开始关联的所有对象开始遍历整个可达分析路径的对象。这个时间比较长,所以采用并发处理(垃圾回收器线程和用户线程同时工作);
  • 重新标记(短暂),为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短;
  • 并发清除(和用户的应用程序同时进行):垃圾回收

整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS 收集器的内存回收过程是与用户线程一起并发执行的。


四、G1 收集器

G1(Garbage-First)收集器是最前沿的成果之一,在Java7 update 4之后引入(Jdk7 的第 4 个版本),是一款面向服务端应用的垃圾收集器。在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。

G1 是一个分代的,增量的,并行与并发的“标记-复制”垃圾回收器。它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。

G1收集器的优势:

  • 独特的分代垃圾回收器,分代GC: 分代收集器,同时兼顾年轻代和老年代;

  • 使用分区算法,不要求 eden,年轻代或老年代的空间都连续;

  • 并行性: 回收期间,可由多个线程同时工作,有效利用多核cpu资源;

  • 空间整理: 回收过程中,会进行适当对象移动,减少空间碎片;

  • 可预见性: G1 可选取部分区域进行回收,可以缩小回收范围,减少全局停顿。

G1 收集器运行示意图

G1收集器的阶段分以下几个步骤:

  1. 初始标记(它标记了从GC Root开始直接可达的对象);

  2. 并发标记(从GC Roots开始对堆中对象进行可达性分析,找出存活对象);

  3. 最终标记(标记那些在并发标记阶段发生变化的对象,将被回收);

  4. 筛选回收(首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region)。


五、相关知识点

1、HotSpot 的 Server 和 Client 两种模式

HotSpot 包括 Server 和 Client 两种模式的实现:

  • Java HotSpot Client VM(-client),为在客户端环境中减少启动时间而优化;
  • Java HotSpot Server VM(-server),为在服务器环境中最大化程序执行速度而设计。

比较:Server VM 启动比 Client VM 慢,运行比 Client VM 快。Server 模式的运行中,垃圾回收处理做的比较好一些。

2、设置回收器的参数

下面给出配置回收器时,经常使用的参数:

  • -XX:+UseSerialGC:在新生代和老年代使用串行收集器
  • -XX:+UseParNewGC:在新生代使用并行收集器
  • -XX:+UseParallelGC :新生代使用并行回收收集器,更加关注吞吐量
  • -XX:+UseParallelOldGC:老年代使用并行回收收集器
  • -XX:ParallelGCThreads:设置用于垃圾回收的线程数
  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  • -XX:ParallelCMSThreads:设定CMS的线程数量
  • -XX:+UseG1GC:启用G1垃圾回收器
3、各类回收器总结
回收器 回收代 回收模式 回收算法 特点
Serial 新生代 单线程 标记-复制 简单高效,内存消耗少, 停顿时间能控制在一百毫秒内
ParNew 新生代 多线程 标记-复制 Serial 的多线程版本
Parallel Scavenge 新生代 多线程 标记-复制 关注重点为吞吐量
Serial Old 老年代 单线程 标记-整理 同 Serial 简单高效,内存消耗少
Parallel Old 老年代 多线程 标记-整理 同 Parallel Scavenge 适合那些注重吞吐量和 CPU 资源敏感的场合
CMS 老年代 多线程 标记-清除 并发收集、低停顿,但是会产生大量空间碎片、并发阶段会降低吞吐量
G1 多线程 标记-复制 同时兼顾年轻代和老年代,针对于大 heap

垃圾回收器的选用决定因素:应用程序的场景、硬件的制约 以及 吞吐量的需求。

  • 串行垃圾回收是最简单的也是效率最低的,如果只是控制台的单线程程序,简单任务,并且机器配置不高,推荐使用。
  • 并行垃圾回收器是 64bit server 默认的垃圾回收器,一般我们工作和生产上默认不配置,都是并行垃圾回收。对于一般的不要求吞吐的应用,并且硬件资源不是太充足的情况下,并行垃圾回收器差不多能满足需求。
  • CMS 垃圾回收器是对并行垃圾回收器的一个优化,它以 CPU 和系统资源为代价,换取 GC 的延迟。不会一 GC 就 STW,而是根据情况 STW。一定程度上是资源换取速度。
  • G1 垃圾回收器是针对于大 heap 的垃圾回收器,如果 heap 分配的足够大,分的 region 的优先级回收策略会优先清理垃圾多的 region 并且减少了内存空间碎片,分配大对象时不会因为无法找到连续内存空间而提前触发下一次 GC。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45187434/article/details/127713041

智能推荐

Sweets for Everyone!(CF-248D)_stockings mom-程序员宅基地

文章浏览阅读340次。Problem DescriptionFor he knew every Who down in Whoville beneath, Was busy now, hanging a mistletoe wreath. "And they're hanging their stockings!" he snarled with a sneer, "Tomorrow is Christmas! ..._stockings mom

【幻化万千戏红尘】qianfengDay20-java基础学习:数据流、随机读取文件流RandomAccessFile-程序员宅基地

文章浏览阅读189次。课程回顾:流:转换流:字符和字节的转换对象流(Object):序列化,反序列化打印流(Print):打印各种数据类型的数据今日内容:数据流(Data):支持将基本数据类型写出,字节流,处理流1、DataOutputStream:数据输出字节流常用方法:writeXXX:写出基本数据类型的数据writeUTF:写

计算机通天之路第一季:计算机硬件基础_计算机天问之路-程序员宅基地

文章浏览阅读365次。时间:2017-1-6 20:32:07 今天学习了计算硬件基础,从零开始电脑内部主要包括的几个关键1. 电源电源是电脑的供电者,没有电源一切免谈。其质量好坏,决定了电脑各个部件的电压稳定程度,当你玩着玩着就没电了,或者电压不稳,死机了,蓝屏了,你是什么感受? 2. CPU系统的核心,又称中央处理器,相当于计算机的大脑,负责:算数运算,逻辑运算,数据传输。3. 内存全称:内部存储器。特点是:体积_计算机天问之路

Ubuntu安装MySQL时出现E: Unable to locate package mysql-server 的解决方法-程序员宅基地

文章浏览阅读2.3k次,点赞5次,收藏4次。在Ubuntu系统下,利用apt-get install安装MySQL时sudo apt-get install mysql-server出现如下问题:解决的办法:使用命令sudo apt-get update更新软件源sudo apt-get update然后再输入 sudo apt-get install mysql-server 就可以安装了sudo apt-get install mysql-server..._unable to locate package mysql-server

调用超时或找不到服务器,进入某个功能(如:基础档案、填制凭证等)提示:连接超时或数据服务器连接失败...-程序员宅基地

文章浏览阅读89次。用友软件增加明细科目时提示新增会计科目是,提示上级科目已经使用,新增科目将自动改为上级科目的设置已经使用的科目如何增加明细科目在软件操作过程中,经常会遇到对已经使用的科目,要求增加其明细科目的问题。科目已经使用,有两种情形:1、该科目没有期初余额或本期发生数,但在月末转账定义中使用。2、该科目已经有期初余额或本期发生数。下面分别就这两种情形的处理方法,分别进行介绍。情形1:该科目没有期初余额或本期..._调用超时应用集成平台连接异常

东北大学c语言编程及答案,东北大学c语言编程试题及其答案.doc-程序员宅基地

文章浏览阅读730次。东北大学C语言题库第一部分( 选择题 )1、构成C语言的基本单位是________。你的答案是:正确答案是:B过程函数语句命令2、设x为整型变量,不能正确表达数学关系:55<="">x>5&&x<10x==6||x==7||x==8||x==9!(x<=5)&&(x<10)3、在C语言中,逻辑运算符的优先级从高到低的排列顺序为__..._以下有关结构体类型描述正确的是 a.结构体类型的大小为其各成员所占内存的总和b.

随便推点

Airtest从入门到放弃?不要急,这份免费的“超长”攻略请收好!_airtest官网-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏12次。此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途前言不知道你有没有遇到这种情况?在刚接触我们的Airtest项目的时候,总是兴致满满、斗志昂扬;但使用一段时间后,却总是被“找不到图片”、“连不上设备”、“录制的脚本不能运行”这些问题劝退。不要着急,今天我们特意跟同学们分享下当年入坑Airtest的经验;希望看完今天这篇攻略,可以让你在入门Airtest的时候少走一些弯路!1.设备连接篇1)连接Android设备A._airtest官网

【Android】adb+shell - 实现滑动、等待、返回自动化_adb shell 滑动-程序员宅基地

文章浏览阅读2.8k次。adb 模拟手机操作,获取 微信读书 时长 -> 虚荣心漫番刷广告_adb shell 滑动

uipath和python哪个好_UiPath从入门到精通视频教程-程序员宅基地

文章浏览阅读251次。匠厂出品,必属精品 Uipath中文社区qq交流群:465630324uipath中文交流社区:https://uipathbbs.comRPA之家qq群:465620839第一课--UiPath的安装与激活第二课--UiPath设计器介绍第三课--UiPath变量介绍第四课--UiPath条件判断第五课--UiPath循环第六课--UiPath整合流程控制语句第七课--UiPath邮件发送之..._uipath和python哪个好

Doolittle分解法(LU分解法)的Python实现_杜立特尔三角分解法python-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏17次。在解一般的非奇异矩阵线性方程组的时候,或者在迭代改善算法中,需要使用LU分解法。对于一个一般的非奇异矩阵A=(a11, a12,…,a1n,a21,…ann),可分解为一个下三角矩阵L和一个上三角矩阵U。其中L的主对角线元素都是1.希望得到一个M,最后在需要的时候将M拆分为L和UM=[[u11 u12 u13 ...... u1n l21 u22 u23 ...... u2n ..._杜立特尔三角分解法python

python关键词统计_Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——对抽取的关键词进行词频统计...-程序员宅基地

文章浏览阅读384次。Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——对抽取的关键词进行词频统计20180413学习笔记一、工作前天在对帖子的关键词抽取存储后,发现一个问题。我似乎将每个关键词都存到分离的cell中,这样在最后统计总词频的时候,比较不好处理。于是,上回的那种样式:是不行的,应该把它们放到同一列(行)中,组装成一个list或tuple再进行词频统计。1.读取输出文件“t1..._openpyxl如何关键字出现计数

python在数据分析方面的应用、下列说法正确_智慧树知到大数据分析的python基础答案...-程序员宅基地

文章浏览阅读1.8k次。智慧树知到大数据分析的python基础答案在派生类中可以通过 “ 基类名 . 方法名 ()” 的方式来调用基类中的方法 .下面代码的执行结果是 : ( ) a = 10.99 print( complex(a))numpy 中求最大值方法是: ( )下面代码的输出结果是 : ( ) vlist = list( range(5)) print( vlist)计算numpy中元素个数的方法是: ( ..._关于python在数据分析方面的应用,以下说法正确的是哪些选项