当前位置: 首页 > news >正文

垃圾回收器介绍

d650c63f7da8401ea70e6f7179a97ba6.jpgjava堆内存结构包括:新生代和老年代,其中新生代由一个伊甸区和2个幸存区组成,2个幸存区是大小相同,完全对称的,没有任何差别。我们把它们称为S0区和S1区,也可以称为from区和to区。

 

 

JVM的垃圾回收主要是针对以上堆空间的垃圾回收,当然其实也会针对元数据区(永久区)进行垃圾回收,在此我们主要介绍对堆空间的垃圾回收。

 

下面我们介绍几种垃圾回收器:

 

串行收集器

 

顾名思义,串行收集器就是使用单线程进行垃圾回收。对新生代的回收使用复制算法,对老年代使用标记压缩算法,这也和我们上一篇介绍的算法优势是相吻合的。

 

串行收集器是最古老最稳定的收集器,尽管它是串行回收,回收时间较长,但其稳定性是优于其他回收器的,综合来说是一个不错的选择。要使用串行收集器,可以在启动配置时加上以下参数:

 

-XX:+UseSerialGC

 

串行回收器的执行流程如下所示:

 

clip_image004

 

执行垃圾回收时,应用程序线程暂停,GC线程开始(开始垃圾回收),垃圾回收完成后,应用程序线程继续执行。注意:在GC线程运行过程中使用单线程进行串行回收。

 

并行回收器

 

并行回收器你可能已经猜到就是使用多线程并行回收,不过这里需要注意的是,针对新生代和老年代,是否都使用并行,有不同的回收器选择:

 

1、 ParNew回收器

 

这个回收器只针对新生代进行并发回收,老年代依然使用串行回收。回收算法依然和串行回收一样,新生代使用复制算法,老年代使用标记压缩算法。在多核条件下,它的性能显然优于串行回收器,如果要使用这种回收器,可以在启动参数中配置:

 

-XX:+UseParNewGC

 

如果要进一步指定并发的线程数,可以配置一下参数:

 

-XX:ParallelGCThreads

 

ParNew回收器的流程如下图所示:

 

clip_image006

 

在进行垃圾回收时应用程序线程依然被暂停,GC线程并行开始执行垃圾回收,垃圾回收完成后,应用程序线程继续执行。

 

2、 Parallel回收器

 

依然是并行回收器,但这种回收器有两种配置,一种类似于ParNEW:新生代使用并行回收、老年代使用串行回收。它与ParNew的不同在于它在设计目标上更重视吞吐量,可以认为在相同的条件下它比ParNew更优。要使用这种回收器可以在启动程序中配置:

 

-XX:+UseParallelGC

 

Parallel回收器另外一种配置则不同于ParNew,对于新生代和老年代均适应并行回收,要使用这种回收器可以在启动程序中配置:

 

XX:+UseParallelOldGC

 

Parallel回收器的流程和ParNew的流程是一致的:

 

clip_image008

 

在进行回收时,应用程序暂停,GC使用多线程并发回收,回收完成后应用程序线程继续运行。

 

CMS回收器

 

CMS回收器: Concurrent Mark Sweep,并发标记清除。注意这里注意两个词:并发、标记清除。

 

并发表示它可以与应用程序并发执行、交替执行;标记清除表示这种回收器不是使用的是标记压缩算法,这和前面介绍的串行回收器和并发回收器有所不同。需要注意的是CMS回收器是一种针对老年代的回收器,不对新生代产生作用。这种回收器优点在于减少了应用程序停顿的时间,因为它不需要应用程序完成暂定等待垃圾回收,而是与垃圾回收并发执行。要执行这种垃圾回收器可以在启动参数中配置:

 

-XX:+UseConcMarkSweepGC

 

CMS回收机运行机制非常复杂,我们简单的将他的运行流程分为以下几步:

 

初始标记

 

标记从GC Root可以直接可达的对象;

 

并发标记(和应用程序线程一起)

 

主要标记过程,标记全部对象;

 

重新标记

 

由于并发标记时,用户线程依然运行,因此在正式清理前,再做依次重新标记,进行修正。

 

并发清除(和用户线程一起)

 

基于标记结果,直接清理对象。

 

流程如下图所示:

 

clip_image010

 

从上图可以看到标记过程分三步:初始标记、并发标记、重新标记,并发标记是最主要的标记过程,而这个过程是并发执行的,可以与应用程序线程同时进行,初始标记和重新标记虽然不能和应用程序并发执行,但这两个过程标记速度快,时间短,所以对应用程序不会产生太大的影响。最后并发清除的过程,也是和应用程序同时进行的,避免了应用程序的停顿。

 

CMS的优点显而易见,就是减少了应用程序的停顿时间,让回收线程和应用程序线程可以并发执行。但它也不是完美的,从他的运行机制可以看出,因为它不像其他回收器一样集中一段时间对垃圾进行回收,并且在回收时应用程序还是运行,因此它的回收并不彻底。这也导致了CMS回收的频率相较其他回收器要高,频繁的回收将影响应用程序的吞吐量。

 

G1回收器

 

G1回收器是jdk1.7以后推出的回收器,试图取代CMS回收器。

 

不同于其他的回收器、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于老年代、也有可能是新生代,并且每类区域空间可以是不连续的(对比CMS的老年代和新生代都必须是连续的)。这种将老年代区划分成多块的理念源于:当并发后台线程寻找可回收的对象时、有些区块包含可回收的对象要比其他区块多很多。虽然在清理这些区块时G1仍然需要暂停应用线程、但可以用相对较少的时间优先回收包含垃圾最多区块。这也是为什么G1命名为Garbage First的原因:第一时间处理垃圾最多的区块。要使用G1回收器需要在启动是配置以下参数:

 

-XX:+UseG1GC

 

G1相对CMS回收器来说优点在于:

 

1、因为划分了很多区块,回收时减小了内存碎片的产生;

 

2、G1适用于新生代和老年代,而CMS只适用于老年代。

相关文章:

  • FDU 2020 | 1. 食堂打饭
  • 基于SpringBoot的“智慧食堂”系统(源码+数据库+文档+PPT)
  • 突破编程_C++_设计模式(状态模式)
  • C语言分析基础排序算法——计数排序
  • 网络建设与运维培训介绍和能力介绍
  • Linux--搭建Zabbix监控系统
  • Vue3:ref和reactive实现响应式数据
  • Java中常用的集合及方法(2)
  • Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入
  • Java学习笔记NO.18
  • 去除PDF论文行号的完美解决方案
  • 云计算项目十一:构建完整的日志分析平台
  • C++进阶学习
  • AWS使用 Client VPN 配置访问VPC 内网资源
  • android pdf框架-7,白边切割
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CSS居中完全指南——构建CSS居中决策树
  • Git学习与使用心得(1)—— 初始化
  • javascript从右向左截取指定位数字符的3种方法
  • JSDuck 与 AngularJS 融合技巧
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Tornado学习笔记(1)
  • Yeoman_Bower_Grunt
  • 从0实现一个tiny react(三)生命周期
  • 微信小程序--------语音识别(前端自己也能玩)
  • 消息队列系列二(IOT中消息队列的应用)
  • MyCAT水平分库
  • 正则表达式-基础知识Review
  • ​iOS安全加固方法及实现
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #vue3 实现前端下载excel文件模板功能
  • $ git push -u origin master 推送到远程库出错
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (BFS)hdoj2377-Bus Pass
  • (C++17) std算法之执行策略 execution
  • (Git) gitignore基础使用
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (转载)利用webkit抓取动态网页和链接
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat文件调用java类的main方法
  • .NET MVC第三章、三种传值方式
  • .NET 回调、接口回调、 委托
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET开发者必备的11款免费工具
  • .net与java建立WebService再互相调用
  • @Controller和@RestController的区别?
  • @TableLogic注解说明,以及对增删改查的影响
  • [acwing周赛复盘] 第 69 场周赛20220917
  • [AIGC] Redis基础命令集详细介绍
  • [Android] Android ActivityManager
  • [C puzzle book] types
  • [C#][DevPress]事件委托的使用