JVM垃圾回收器

2023-11-02

目录

串行垃圾回收器(Serial Collector)

并发式垃圾回收器

 7种经典垃圾回收器

Serial 收集器

ParNew收集器

Parallel Scavenge收集器

CMS收集器

G1收集器

小结

常用参数


按垃圾回收器的线程数可以分为串行垃圾回收器和并行垃圾回收器。

串行垃圾回收器(Serial Collector)

        串行回收指在同一时间段内只有一个CPU用于执行垃圾回收操作,这时候工作线程被暂停,直到垃圾收集工作结束。串行垃圾回收器常常被用在单CPU处理器或内存比较小的硬件平台。

并行垃圾回收器(Parallel Collector)

        并行回收是指在同一段时间内有多个CPU同时用于垃圾回收,虽然提高了吞吐量,但是还是存在“Stop The World”的问题。

        按工作模式可以分为并发式垃圾回收器和独占式垃圾回收器。

并发式垃圾回收器

        并发式垃圾回收器可以与应用程序交替工作,可以尽量减少程序的卡顿时间。

独占式垃圾回收器

        独占式垃圾回收器(Stop The World)一旦执行,就停止程序中的所有用户线程,直到垃圾回收工作结束后用户线程才恢复工作。

7种经典垃圾回收器

Serial 收集器

            Serial串行收集器,适合于单核CPU的客户端端,是HotSpot最早退出的一款垃圾收集器。一般用于嵌入式,单核CPU的场景,一般搭配Serial Old 一起使用,但是这款垃圾收集器在现代的多CPU服务器环境下用得非常少了。 

ParNew收集器

        ParNew收集器与Serial收集器非常像,Serial收集器是单线程的,ParNew是多线程的。Par是Paraller的缩写,New表示只能处理新生代。ParNew收集器在新生代中也是采用复制算法,同样存在“Stop The World”的问题。

        ParNew更适合在多CPU的服务器,Serial更适合用于单CPU的服务器(如嵌入式,client客户端等)。ParNew在多CPU环境下能够充分利用多CPU的物理硬件优势快速完成垃圾收集,但是在单CPU环境下存在线程切换的额外开销,导致效率不一定比Serial快。而Serial虽然能够部署在多CPU服务器,但是没办法充分利用CPU核数优势,只是使用单核资源,比不上ParNew高效。

        在JDK9之后,老年代不再搭配Serial Old。

        ParNew 收集器在jdk8及之后用得非常少,jdk9已经不再推荐使用。

Parallel Scavenge收集器

        Parallel Scavenge收集器同样采用了复制算法,并行收集,也存在“Stop The World"问题。与ParNew收集器不同,Parallel Scavenge设计出来是吞吐量优先的垃圾收集器。

        高吞吐量可以更高效地利用CPU时间,尽快完成任务,主要用于后台运行而不需要太多交互的任务。比如批量处理,订单处理,后台定时任务等场景。

        jdk6之后提供了Parallel Old收集器用于替换serial old收集器,以便老年代的垃圾收集提高效率。因此一般都是Parallel Scavenge和Parallel Old搭配使用,jdk8默认的就是这种垃圾收集器。

CMS收集器

        是在JDK1.5,HotSpot虚拟机推出的一款在强交互应用中具有划时代意义的垃圾收集器,CMS(Concurrent-Mark-Sweep)收集器,是HotSpot虚拟机中第一款真正意义上的并发收集器,第一次实现了垃圾收集线程与用户线程同时工作。

        CMS收集器的关注点是尽可能缩短垃圾收集时用户线程的停顿时间。用户线程停顿时间越短,就越适合于与用户交互的程序。目前主要适合于互联网网站或一些B/S系统的服务端,适合于比较重视服务响应速度,希望系统卡顿时间短的应用。

        jdk9之后已经废弃了CMS收集器,默认的收集器已经改为了G1收集器。在jdk14已经删除了CMS收集器。

        CMS垃圾收集器采用标记-清除算法,也会存在“Stop The World”的问题。        

        CMS工作原理,主要分为以下4个阶段:

        1.初始标记:在这个阶段,所有的工作线程都会因为“Stop The World”停止,然后标记出GC Roots 能够关联的对象,一旦标记完成,所有的被暂停的工作线程又恢复工作,这个过程非常快。

        2.并发标记:把GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程比较耗时但是无需停止工作线程。

        3.重新标记:这个过程是为了修复并发标记阶段中,因用户线程继续工作而导致标记对象产生变动导致在GC Roots中变为不可达或可达的对象,只保留可达对象。也存在“Stop The World”的情况,这个过程比初始标记的耗时要多,但是比并发标记的耗时少。

        4.并发清除:清理删除标记阶段判断的已经死亡的对象,释放内存。

        特点:

        1.由于并发标记和并发清除阶段,无需“Stop The World”,所以整体回收是低停顿的。

        2.由于在垃圾收集阶段用户线程是没有中断的,在CMS回收过程中,还应该确保用户线程又足够的内存空间,要是没有足够的内存空间,CMS垃圾收集器就会临时启用Serial Old收集器来重新进行老年代的垃圾收集,导致卡顿时间边变长。

        3.由于采用了标记-清除算法,导致内存回收后所释放的内存空间存在不连续的情况。

        4.为什么不采用标记-压缩算法?是因为在标记阶段无需停止用户线程,就不能移动对象在内存中的位置,采用压缩算法是需要把不可达对象删除,在内存中把可达对象移动到相对连续的位置,然后留下较大的内存空间。

G1收集器

        官方推出G1(Garbage First)收集器的目标是在延迟可控的情况下获得尽可能高的吞吐量(即在有限的暂停时间内获得最大的吞吐量)。 G1收集器把内存分割为多个不相关的区域(region),使用不同的region表示Eden,survior0,survior1,老年代等,;G1中的新生代老年代这些堆内存物理上是不连续的逻辑上是连续的。避免在整个java堆中进去全区域的垃圾收集,G1与过去的Parallel,CMS等收集器的内存模型差别非常大,是按region区进行GC Roots检索,每次垃圾收集时都是检查部分的region,这样的耗时就比较小。旧的垃圾收集器是当新生代或老年代快满的时候才进行垃圾收集,是对整个新生代或老年代堆进行GC Roots可达性检索非常耗时。

        

        region区:region分为Eden,Survior,Old,Humongous内存区域,每一个region就是这些内存区域的一个角色,Humongous区域比较特殊,是G1用来存放大对象的内存区域,当大对象超过1.5个region时,就会放到Humongous区。

        G1收集器适合在具有大内存多处理器的机器上的程序,非常适合要求GC停顿时间少的场景,但是内存一般在6G以下的表现甚至不如CMS收集器,当内存大于等于6G时表现就比较好。

        G1收集器是jdk7推出的,但是在jdk9才是默认的垃圾收集器。

小结

        最小化使用内存和并行开销:Serial GC

        最大化程序吞吐量:Parallel Scavenge GC

        最小化GC停顿时间:CMS GC

        JKD9之后用G1(ZGC还未成熟,等到官方默认使用ZGC的jdk版本之后再使用ZGC吧)

常用参数

                -XX:+UseSerialGC 开启Serial收集器,新生代为Serial,老年代为Serial Old。

                -XX:+UseParNewGC    开启新生代使用ParNew收集器

                -XX:ParallelGCThreads ParNew收集器线程数量,默认是与CPU核数相同

                -XX:+UseParallelGC 开启新生代使用Parallel Scavenge收集器,jdk8默认开启。

                -XX:+UseParallelOldGC 开启老年代使用Parallel Old收集器,jdk8默认开启。

                                -XX:+UseParallelGC 和  -XX:+UseParallelOldGC 任意一个开启后,另外一个默认也开启。

                -XX:MaxGCPauseMillis 设置Parallel Scavenge收集器的最大停顿时间(Stop The World)

                -XX:GCTimeRatio 设置Parallel Scavenge收集器的垃圾收集时间占总时间的比例,默认值是99,也就是垃圾收集时间不超过1%,与  -XX:MaxGCPauseMillis 有一定的矛盾,暂停时间越长,  -XX:GCTimeRatio 就越有可能超过限制。

                -XX:+UseConcMarkSweepGC 开启使用CMS垃圾回收器,开启这个参数后会自动开启-XX:+UseParNewGC,即ParaNew(新生代) + CMS(老年代) +Serial Old(老年代备用)的组合。

                -XX:CMSlnitiatingOccupanyFraction 表示CMS垃圾收集器的堆内存使用率阈值,一旦达到该阈值就开始回收,在jdk5时默认是68,表示堆内存使用率达到68%时会执行一次CMS回收,jkd6之后是92。如果内存增长缓慢,可以设置一个较大的阈值,较大的阈值能够减少CMS的执行频率,减少老年代的回收次数从而较为明显的改善程序性能。如果内存增长非常快,在要降低阈值,避免频繁触发老年代串行收集器。

                -XX:useG1GC 开启G1垃圾收集器

                -XX:G1HeapRegionSize        设置G1收集器的每个Region大小,值是2的幂,范围是1M-32M之间,默认是堆的1/2000。

                -XX:MaxGCPauseMillis        设置G1收集器最大的停顿时间,默认是200ms。

                

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM垃圾回收器 的相关文章

  • 在java中轮询Http服务器(重复发送http get请求)

    当对其进行 REST 调用时 我的 Web 服务器会发送一些信息 我想不断轮询该服务器 间隔5秒后重复发送HTTP GET请求 以检查返回的信息是否有任何变化 做到这一点最有效的方法是什么 您能提供一些代码示例吗 请注意 我只想开发客户端代
  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 垃圾收集器如何在幕后工作来收集死对象?

    我正在阅读有关垃圾收集的内容 众所周知 垃圾收集会收集死亡对象并回收内存 我的问题是 Collector 如何知道任何对象已死亡 它使用什么数据结构来跟踪活动对象 我正在研究这个问题 我发现GC实际上会跟踪活动对象 并标记它们 每个未标记的
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Java 的支持向量机?

    我想用Java编写一个 智能监视器 它可以随时发出警报detects即将到来的性能问题 我的 Java 应用程序正在以结构化格式将数据写入日志文件
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • python实现Flask GET Demo

    python代码 from flask import Flask request jsonify app Flask name 用 data路径路由 app route data def get data 以下一行是从URL中获取参数的ge
  • abb机器人指令手册_ABB机器人自定义错误处理

    更多内容请点击上方 ABB机器人实战技巧 关注 也可点击公众号下方 往期经典 浏览更多内容 转载请先后台留言 大家一起支持原创 推动机器人使用和发展 本公众号对各类ABB机器人应用 仿真 毕业设计提供技术支持 详细后台留言 本公众号诚挚希望
  • 【SQL】Spark HiveSQL常见报错

    无权限更新 Authorization failed No privilege Update found for outputs 库或表对象不存在 com microsoft sqlserver jdbc SQLServerExceptio
  • HDF5 CMake 生成 C\C++ 可用的 lib 文件和 dll 文件

    一 原料 HDF5 源码 下载地址 https www hdfgroup org downloads hdf5 source code 下载对应系统的版本 我的是 Windows 10 选择红框标示的版本 CMake 下载地址 https
  • Python Pandas对空值的处理

    1 dropna 删除所有值为空的行 s3 dropna axis index how all inplace False how字段可选有any和all any表示只要有空值出现就删除 all表示全部为空值才删除 inplace字段表示是
  • html实现侧边滑动效果,基于slideout.js实现移动端侧边栏滑动特效

    HTML5现在本领太大了 PC端已经无法满足它的胃口了 它将强势攻入移动端 所以移动端中各种特效也得基于HTML5实现 看看我们将要介绍的slideout js 能帮我们实现怎么样的侧边栏滑动特效呢 先看下运行效果 一 准备资料 只需要准备
  • 概率论 思维导图复习提纲

    2020 4 27更新 原xmind及pdf文件已上传至百度网盘 链接 https pan baidu com s 1q1U4cNkphVbfP8rZByLgrw 提取码 xte7 2020 4 4 更新 如果需要原xmind文件或pdf文
  • 图解红黑树-一文带你搞定旋转、插入、删除

    图解红黑树 一文带你搞定旋转 插入 删除 文章目录 图解红黑树 一文带你搞定旋转 插入 删除 toc 1 定义 2 性质 3 平衡操作 0 总结 1 插入 1 0 插入的节点为红色节点 1 1 被插入的节点是根节点 1 2 被插入的节点的父
  • Sublime Text 2.0.1 2217 版本破解注册方法(32位)

    准备工具 十六进制编辑器 这里以WinHex为例 1 安装最新的Sublime Text 2 0 1 2217版本http www sublimetext com 2 32位 2 备份sublime text exe 然后用 WinHex十
  • IntelliJ IDEA使用教程:一个沉浸式的 IDE 工具

    IntelliJ IDEA 一个沉浸式的 IDE 工具 本文基础 IntelliJ IDEA 旗舰版或者说是 JetBrains 家所有 IDE 的旗舰版 核心概念 讲 IntelliJ IDEA 的好 带更多人入坑 说几句老实话 劝别人换
  • RS485 硬件自收发切换的实现

    RS485抗噪音抗干扰能力强 传输距离远 支持多点通信 是工控行业首选串行接口 485规定的电气特性为2线 半双工多点通信 采用两线差分信号传输数据 具有抗共模干扰的能力 由于是半双工模式 因此通讯时需要切换收发状态 目前常用的485收发切
  • Ubuntu如何重启网络

    更多课程点击此处 快速链接 专栏目录 环境搭建安装问题笔记目录 付费专栏 付费课程 购买须知 个人博客笔记导读目录 全部 网络的IP地址没了 我们只要重启网络即可 sudo systemctl restart NetworkManager
  • “vue-amap“: “^0.5.10“, 高德地图 vue版本 H5地图 实现根据地名搜索坐标,经纬度

    本文介绍高德地图在vue框架中的使用方法 H5地图通用 首先引入 vue amap 0 5 10 npm install vue amap 然后在main js里写入如下代码 import VueAMap from vue amap Vue
  • javaweb 配置系统错误页面404或500 等其他错误代码

    web xml
  • Linux网络的DHCP、FTP原理及配置

    DHCP原理与配置 DHCP服务 使用DHCP动态配置主机地址 DHCP服务 可分配的地址信息主要包括 配置DHCP服务器 FTP 用来传输文件的协议 端口号 FTP数据连接模式 实现FTP功能 实验 DHCP服务 使用DHCP动态配置主机
  • 视图在SQL中的应用

    我们之前对 SQL 中的数据表查询进行了讲解 今天我们来看下如何对视图进行查询 视图 也就是我们今天要讲的虚拟表 本身是不具有数据的 它是 SQL 中的一个重要概念 从下面这张图中 你能看到 虚拟表的创建连接了一个或多个数据表 不同的查询应
  • 锚点机制在目标检测领域的发展综述

    摘要 目标检测是计算机视觉领域的基本任务 近年来 基于深度学习的目标检测研究发展十分迅速 锚点 anchor 机制广泛应用于主流目标检测器中 多尺度的锚点是检测器解决尺度问题的有效方法 但锚点策略也存在尺寸固定 模型鲁棒性差等问题 根据优化
  • fifo介绍及fifo IP核使用(工程文件获取请参考文末)

    一 fifo简介 1 fifo first in first out的缩写 先进先出数据缓存器 与普通存储器的区别 对外接口没有地址线 由此所带来的优点是 不用处理地址信号 时序较简单 缺点是 不能像普通存储器那样自由读写某个地址的数据 只
  • 小巧玲珑:机器学习届快刀XGBoost的介绍和使用

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 张萌 序言 XGBoost效率很高 在Kaggle等诸多比赛中使用广泛 并且取得了不少好成绩 为了让公司的算法工程师 可以更加方便的使用XGBoost 我们将XGBoost更
  • JVM垃圾回收器

    目录 串行垃圾回收器 Serial Collector 并发式垃圾回收器 7种经典垃圾回收器 Serial 收集器 ParNew收集器 Parallel Scavenge收集器 CMS收集器 G1收集器 小结 常用参数 按垃圾回收器的线程数