JVM - 垃圾收集器

news2025/1/16 16:01:31

目录

垃圾收集器

串行垃圾收集器

并行垃圾收集器

什么是 吞吐量优先 什么是 响应时间优先 ?

CMS(并发)垃圾收集器

G1 垃圾收集器


垃圾收集器

垃圾收集器大概可以分为:

  • 串行垃圾收集器
  • 并行垃圾收集器
  • CMS(并发)垃圾收集器
  • G1垃圾收集器

串行垃圾收集器

Serial 和 Serial Old 是 串行垃圾收集器 

使用单线程回收,因此就适用于堆内存较小,CPU数量少的(因为多了也没用)个人电脑

开启串行垃圾收集器的VM参数是:-XX:+UseSerialGC = Serial + SerialOld

Serial 垃圾收集器工作在新生代,采用 标记-复制 算法

SerialOld 垃圾收集器工作在老年代,采用 标记-整理 算法

工作流程如下:

从上图我们看到,在串行垃圾收集器的回收过程中,进程中的其他应用线程需要暂停,也叫 Stop The World(简称 STW) 

 为什么需要STW?

        因为在垃圾回收的工程中,有些对象的地址是会发生改变的,如果垃圾回收的过程中用户线程还在工作,那用户线程就有可能找不到对象, 从而产生错误,因此在垃圾回收器进行回收的过程中,其他用户线程都要阻塞 

并行垃圾收集器

并行垃圾收集器即  Parallel New 和 Parallel Old

并行垃圾收集器是 吞吐量优先 的垃圾收集器

什么是 吞吐量优先 什么是 响应时间优先 

吞吐量优先

使用多线程回收,适用于堆内存较大,CPU较多的场景(如果是CPU个数较少,比如单核CPU,会导致回收线程之间相互争抢CPU的时间片,导致线程上下文切换的时间浪费,效率反而会比串行的垃圾回收器低),适合工作在服务器上

吞吐量优先的目标是:在单位时间内,让Stop The  World(以下简称STW)的时间最短

响应时间优先

同样也是多线程回收,同样适用于堆内存较大,CPU较多的场景,同样适合工作在服务器上

响应时间优先的目标是:让单次的STW的时间最短

一个例子区分 吞吐量优先响应时间优先

在一个单位时间内,吞吐量优先追求 0.5 + 0.5 = 1,吞吐量不在乎 0.5 很大,只在乎 1 最小,而响应时间优先追求 0.3 + 0.3 + 0.3 +0.3 +0.3 =1.5 ,响应时间优先不在乎1.5很大,只在乎 0.3 最小

开启并行的垃圾收集器的参数是:-XX:+UseParallelGC ~ -XX:+UseParallelOldGC

ParallelGC 垃圾收集器工作在新生代中,采用 标记-复制 算法

ParallelOldGC 垃圾收集器工作在老年代中,采用 标记-整理 算法

在 jdk 1.8 中默认使用的就是 ParallelGC,而这两个开关是一同开启的,也就是开启 ParallelGC会连同开启ParallelOldGC

Parallel 就是并行的意思,说明这些垃圾回收线程是并行执行的

工作流程如下:

通过参数 -XX:ParallelGCThreads=n  可以设置垃圾回收线程的数量

除此之外还有三个比较重要的参数:

-XX:+UseAdaptiveSizePolicy :采用自适应的大小调整策略,会动态的调整 Eden 和 Survivor 的比例,还会调整堆的大小、老年代的晋升阈值等

-XX:GCTimeRatio=ratio : 用于调整垃圾回收的时间在总工作时间中的占比,计算公式为 1/(1+ratio),如果达不到设置的时间占比,ParallelGC就会尝试调大堆的大小,因为堆的容量较大,GC的次数就会比较少,ratio的值默认为99,但是 1/100 的占比时间很难达到,因此我们正常将 ratio 设置为19

-XX:MaxGCPauseMillis=ms : 单次垃圾回收的最大时间,默认值200ms,于 -XX:GCTimeRatio 参数存在冲突,因为 -XX:GCTimeRatio 可能为了达到目标,而调大堆的大小,而且堆越大,单次垃圾回收的时间就越长

CMS(并发)垃圾收集器

CMS全称 Concurrent Mark Sweep,是一款并发的、使用 标记-清除 算法的垃圾回收器

该回收器是针对老年代垃圾回收的,是一款 响应时间优先 的收集器,停顿时间短,用户体验就好

其最大特点是在进行垃圾回收时,应用仍然能正常运行 

开启 CMS垃圾收集器 的参数:-XX:+UseConcMarkSweepGC ~ -XX:+UseParNewGC ~ SerialOld

ConcMarkSweepGC 可能会存在并发失败的问题,如果出现并发失败,那 ConcMarkSweepGC 就会退化成 SerialOldGC 

工作流程如下:

 从上面我们可以看到,只有 初始标记 和 重新标记 阶段需要STW,而这两阶段的时间又非常短,因此能达到更好的响应时间

在初始标记阶段,只会标记出跟GC Roots直接相连的对象,在并发标记时,再去标记完整个引用链,因为并发标记的过程中,应用线程仍在运行,所以可能产生出新的垃圾对象,因此需要最后STW去重新标记一遍,标记出新产生的垃圾对象

G1 垃圾收集器

G1(Garbage First)是 JDK 9 之后默认的垃圾收集器,同时注重吞吐量低延迟

适用于超大的堆内存,其工作原理是将堆划分为多个大小相等的 Region ,此时就没有了新生代和老年代的比例一说,因为每个 Region 都可以单独作为 Eden、Survivor、老年代

G1采用 标记 - 复制 算法

如果在 JDK 1.8 中使用G1,需要设置VM参数:-XX:+UseG1GC

工作流程如下:

初始状态下,会将几块 Region 划分为 Eden ,G1垃圾收集器中新生代的占比只有 5% - 6% ,当Eden中的对象过多时,就会进行垃圾回收

垃圾回收采用 标记 - 复制 算法,将 Eden 中幸存的对象复制到 Survivor,并清空Eden,该过程需要STW,但因为幸存的对象是比较少的,所以STW的时间很短

 接下来,又产生多个新对象

再次进行新生代的垃圾回收,Eden中和上一个Survivor中幸存的对象会被复制到新的Survivor中,但上一个Survivor中幸存的对象如果年龄超过晋升阈值,会直接进入老年代中

 最后变成

当老年代占用的内存超过一定阈值(默认45%)后,需进行老年代的垃圾回收,该过程会先进行并发标记,标记出老年代中存活的对象,并发标记过程无需暂停应用线程,并发标记结束后需再进行重新标记(和CMS原理相同,需标记处并发标记过程中新产生的垃圾对象),这个过程需暂停应用线程,但是时间很短

之后进入混合收集阶段,此时不会对所有老年代区域进行回收,而是根据暂停时间目标优先回收价值高(存活对象少)的区域(这也是 Gabage First 名称的由来),比如下图中标红的老年代 

 混合收集 就是连同 Eden 、Survivor 、老年代 进行一次垃圾回收,Eden 、Survivor 的回收过程和上面相同,老年代的回收是新开一个老年代,将三个标红的老年代,还有Survivor中年龄到达阈值的存活对象复制到新的老年代中

 最后变成如下结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解析Python爬虫常见异常及处理方法

作为专业爬虫程序猿长期混迹于爬虫ip解决方案中,我们经常会遇到各种各样的异常情况。在爬虫开发过程中,处理这些异常是不可或缺的一部分。本文将为大家总结常见的Python爬虫异常,并分享相应的处理方法,帮助你避免绊倒在爬虫之路上…

深入了解API标准:为什么它如此重要?| SEO优化

深入了解API标准:为什么它如此重要? 什么是API标准? 在计算机科学领域中,API标准是指应用程序接口的规范和约定。它定义了应用程序之间相互通信和交互的方法和规则。API标准允许软件开发人员使用其他应用程序的功能和数据&#…

排序算法 - Java实现

冒泡排序 排序原理: 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值 代码实现: import java.uti…

【AI绘画】3分钟学会ikun幻术图

目录 前言一、效果展示二、准备工作三、操作步骤3.1平台创建实例3.2 启动SD 四、安装QR Code Monster 模型五、成图 前言 大家热爱的ikun幻术在今天的分享中将呈现。在本文中,我们将揭示一个备受欢迎的图像幻术技术,让您感受到令人惊叹的视觉创造力。 …

超详细 | 蜣螂优化算法DBO原理及其实现(Matlab)

蜣螂优化算法(dung beetle optimizer,DBO)是JiankaXue 和Bo Shen在2022 年提出的一种新型群体智能优化算法[1],其灵感来自于蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为。该算法同时考虑了全局探索和局部开发,从而具有收敛速度快和准确率高的特点…

每日一题leetcode--使循环数组所有元素相等的最少秒数

相当于扩散,每个数可以一次可以扩散到左右让其一样,问最少多少次可以让整个数组都变成一样的数 使用枚举,先将所有信息存到hash表中,然后逐一进行枚举,计算时间长短用看下图 考虑到环形数组,可以把首项n放…

数字技术能让古籍“活过来”吗?

数字技术能让古籍“活过来”吗? 本篇目录: 一、写在前面的话 二、前言 三、你觉得数字技术能让古籍活过来吗? 四、你觉得利用现代技术修复古籍可能遇到的难点是什么? 五、如果有机会为古籍活化助力,你想参与哪部分…

C语言实现16k、48kpcm数据的双向重采样

文章目录 注意事项重采样代码int16_t数据溢出测试代码测试结果 注意事项 音频重采样过程中使用有符号数,确保计算过程正确。在48k->16k的下采样过程中,3个采样点数据相加取平均值不用担心溢出问题。已使用测试代码确认在Linux、Windows均正常。 重采…

生活随笔,记录我的日常点点滴滴.

前言 😘个人主页:曲终酣兴晚^R的小书屋🥱 😕作者介绍:一个莽莽撞撞的🐻 💖专栏介绍:日常生活&往事回忆 😶‍🌫️每日金句:被人暖一下就高热&…

Nuxt3_1_路由+页面+组件+资源+样式 使用及实例

1、 简介 1.1 开发必备 node版本 v16.10.0 我使用的是16.14.0编辑器推荐使用Volar Extension 的VS code插件Terminal 运行nuxt指令 1.2 环境搭建 安装项目: npx nuxilatest init [first_nuxt3]进入项目目录: cd [first_nuxt3]安装依赖:n…

day06-点赞系统

当热心用户或者老师给学生回答了问题以后,所有学员可以给自己心仪的回答点赞,点赞越高,排名也越靠前。 1.1.业务需求 首先我们来分析整理一下点赞业务的需求,一个通用点赞系统需要满足下列特性: 1.2.实现思路 要保…

服务器数据恢复-HP EVA存储常见故障的数据恢复流程

EVA存储原理: EVA系列存储是以虚拟化存储为实现目的的中高端存储设备,内部的结构组成完全不同于其他的存储设备,RAID在EVA内部称之为VRAID。 EVA会在每个物理磁盘(PV)的0扇区写入签名,签名后PV会被分配到不…

项目实施方案案例模板-拿来即用

《项目实施方案》实际案例模板,拿来即用,原件可获取。 项目背景 项目目标 项目范围 项目总体计划 项目组织架构 5.1. 项目职责分工 项目风险点 6.1. 项目风险分析 6.2. 项目实施关键点 项目管理规范 7.1. 项目实施约束 7.2. 项目变更冻结 7…

Vue3组件应用及单文件组件 - 抽象独立的代码

目录 前言01-组件的概念及组件的基本使用方式02-组件之间是如何进行互相通信的03-组件的属性与事件是如何进行处理的04-组件的内容是如何组合与分发处理的05-单文件组件SFC06-Vue CLI脚手架安装 前言 学习前的准备工作 官网地址:https://cn.vuejs.org/ Vue.js文件下…

【校招VIP】前端vue考点之生命周期和双向绑定

考点介绍: VUE是前端校招面试的重点,而生命周期和双向绑定又是基础考点之一,尤其在一二线公司,要求知道双向绑定的原理,以及相关代码实现。 『前端vue考点之生命周期和双向绑定』相关题目及解析内容可点击文章末尾链接…

骨传导耳机骑车好吗,骨传导耳机可用于骑摩托车吗?

如今,越来越多的人在选择耳机时转向了骨传导耳机,相较于传统耳机,这种神奇的创新产品能够让我们享受音乐的同时,也无需将耳机塞入耳中。无论是运动还是日常使用,这种设计都能给我们带来极佳的防丢能力。再也不用担心在…

【DDD - 概念】领域模型

什么是模型: 模型是一种知识形式,它通过对知识进行抽象和选择性简化和有意识的结构化来传达重要的要素信息,它可以使人专注于问题并帮助人快速的理解问题。因为系统需要一整套的知识体系来完成特定的功能,这一整套的知识体系是很…

误删文件恢复软件,这2款小白也能轻松使用!

“快给我推几个好用的文件恢复软件吧!真的非常需要!突然不见了好多重要的文件,让我超级崩溃!怎么找回这些文件呢?” 电脑误删文件已经是一个电脑用户比较常见的问题了,可能很多人都经历过这种崩溃的瞬间。那…

【C# 基础精讲】自定义异常类

自定义异常类是C#中异常处理的一种重要方式,它允许您创建具有自定义错误信息和处理逻辑的异常类型,以提高程序的可读性和可维护性。通过自定义异常类,您可以为特定的业务逻辑或应用场景创建更有意义的异常,使错误处理更加精确和有…

凸优化基础学习——凸集

凸优化基础学习——凸集 文章内容全部来自对Stephen Boyd and Lieven vandenberghe的Convex Optimization的总结归纳。 电子书资源: 链接:https://pan.baidu.com/s/1dP5zI6h3BEyGRzSaJHSodg?pwd0000 提取码:0000 基本概念 仿射集合 **…