垃圾回收器介绍

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只适用于老年代。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/536200.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

presto / trino plugin(自定义UDF函数)开发指南

方案1:自定义udf插件开发 1. Presto插件机制 presto不能像hive那样配置自定义的udf,而是采用插件机制实现。Presto 的插件(Plugin)机制,是 Presto 能够整合多种数据源的核心。通过实现不同的 Plugin,Presto 允许用户在不同类型的数据源之间进行 JOIN 等计算。Presto 内部的…

第十七章垃圾回收器

第十七章垃圾回收器 文章目录 第十七章垃圾回收器1. GC分类与性能指标1.1 垃圾回收器概述1.2 垃圾回收器分类1.3 评估GC的性能指标吞吐量暂停时间吞吐量VS暂停时间 2. 不同的垃圾回收器概述七种经典垃圾回收器七种经典收集器与垃圾分代之间的关系垃圾收集器的组合关系如何查看默…

Nacos 集群搭建

1 . 集群结构图 : 其中包括3个nacos结点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx ; 我们计划的集群结构 : 三个nacos结点的地址 : 节点ipportnacos1192.168.150.18845nacos2192.168.150.18846nacos3192.168.150.18847 2 . 搭建集群 搭…

24考研调剂 | 武汉纺织大学

教育部重点实验室招收24年调剂生,材料、化学、机械工程、计算机、力学等相关专业 考研调剂招生信息 学校:武汉纺织大学 专业:工学->材料科学与工程 年级:2024 招生人数:100 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看)…

macOS安装maven

官网下载maven https://maven.apache.org/download.cgi如下图所示: 1.解压并复制到指定的目录中2.配置环境变量 vim ~/.bash_profile进行文件的修改 export M2_HOME/Users/fanfan/company/apache-maven-3.9.6 export PATH$PATH:$M2_HOME/bin3.终端中输入source ~…

day02vue学习

day02 一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 (演示) 渲染 / 删除 / 修…

vue搭建脚手架遇到的一个bug

看起来运行vue init命令时出现了问题。似乎vue/cli-init插件没有被全局安装。你可以尝试使用npm(Node Package Manager)全局安装它。 按照以下命令: npm install -g vue/cli-init npm install -g vue-cli

考虑功率均分与电压频率的事件触发分布式二次控制MATLAB模型

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 此模型是在《基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型》上进一步创作的,之前的模型只考虑了二次电压与频率控制,并没有考虑均分这一项点。 因此…

帮人写系列——大连浩如科技有限公司的uwb(ros节点)

在读研期间因为项目或者个人兴趣接触过不少传感器,这一款是当时带本科师弟做东西时候买的玩意uwb,因为要用到ros中,需要发布成话题,但对方技术人员说并没有这玩意,就帮忙写了这个,今天反馈说后续产品中一直…

开口式霍尔电流传感器助力直流配电改造

彭姝麟 Acrelpsl 1开口式霍尔电流传感器助力直流配电改造 1.1 改造要求 系统改造要求不停电进行直流系统切改,即在不失去直流电源的情况下进行负荷的倒出和倒入,改造工程难度大。针对此需求,可采用开口式霍尔电流传感器来解决改造项目中直流…

离线数仓(七)【DIM 层开发】

前言 今天开始 DIM 层的开发,说开发好像有点不配,还只是学习阶段,离开发还有很长的路要走。 一个人想象自己不懂得的事很容易浪漫。 --《沉默的大多数》王小波 1、DIM 层开发 DIM层设计要点: DI…

第0章 学习包介绍

一、考试介绍 二、考点分析 白盒测试、黑盒测试、面向对象测试、web测试;下午题考的概率很大; 上午题考点: 三、资料包 四、如何学习