JVM垃圾收集器总结

2023-11-07

        JVM的垃圾收集算法,最终是要由垃圾收集器实现的。不同厂商、不同版本的虚拟机的垃圾收集器实现差别很大。本文只介绍HotSpot中的垃圾收集器,包括:串行收集器、并行收集器、新生代Parallel Scavenge收集器、CMS、G1。

一、整体介绍

        在新生代工作的收集器:Serial、ParNew、Parallel Scavenge

        在老年代工作的收集器:CMS、Serial old、 Parallel old

        同时工作在新生代和老生代的实用的收集器目前只有G1收集器,自JDK9以后G1收集器是默认收集器。

        新生代的收集器和老年代的收集器,是要配合使用的,而且配合选择上是有一定要求的。如上图中,新生代和老年代收集器能用钱连接在一起的,就是可以配合使用的。此外可以使用Serial old给CMS做备用收集器,当CMS不能工作的时候,切换到Serial old处理。

二、串行收集器

        Serial收集器/Serial Old收集器是单线程的收集器,在垃圾收集时,只启一个GC线程进行回收,暂停所有用户线程,会Stop-the-World。

        它的优点是简单,对于单cpu,由于没有多线程交互的开销,可能更高效,是Client模式下的默认新生代收集器。

三、并行收集器

        ParNew收集器,只用于新生代,使用多线程进行垃圾回收,在垃圾收集时,一样会Stop-the-World。

         在并发能力好的CPU环境里,它停顿的时间要比串行收集器短;但对于单CPU或并发能力较弱的CPU,由于多线程的交互开销,可能比串行回收器更差。它是Server模式下首选的新生代售后机器,且能(实际上也只能)和CMS收集器配合使用,只要启用了CMS收集器,新生代就会自动使用ParNew收集器。

        可以通过-XX:ParallelGCThreads指定线程数,最好与CPU数量一致。

四、Parallel Scavenge收集器

        新生代Parallel Scavenge收集器,对应老年代使用Parallel Old收集器。Parallel Scavenge收集器也是使用复制算法的并行收集器,和ParNew很类似,但更关注吞吐量,能最高效率的利用CPU,适合运行后台应用。

五、CMS(Concurrent Mark and Sweep 并发标记清除)收集器

        CMS收集器与前面的收集器有很大不同,它是真正GC线程和用户线程能并发的收集器。前面讲的并行收集器只是GC线程并行,垃圾收集时还是要停止全部用户线程。Serial old将作为CMS发生错误的备用收集器。CMS收集器是JDK8的默认收集器。

CMS收集器工作的时候分成四个大的步骤:
1.初始标记:只标记GC Roots能直接关联到的对象;
2.并发标记:进行GC Roots Tracing的过程;判断哪些对象是垃圾对象;
3.重新标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象;
4.并发清除:并发回收垃圾对象。并发清理后还有一个“重置线程”小动作,重置一下状态。

优点是并发执行,停顿时间少。
缺点是:1、并发执行,对CPU资源压力大;
               2、无法处理在并行回收过程中产生的垃圾,可能导致FullGC
               3、采用的标记清除算法会导致大量碎片,从而在分配大对象时可能触发FullGC 

有一些参数可以设置,比如-XX:CMSInitiatingOccupancyFraction用来设置CMS收集器在老年代空间被使用多少后触发回收,默认80%

六、G1(Garbage-First)收集器:

G1收集器是一款面向服务端应用的收集器,与其它收集器相比,具有如下特点:

1.G1把内存划分成多个独立的区域(Region)
2.G1仍采用分代思想,保留了新生代和老年代,但它们仅是逻辑概念,不再是物理隔离的,而是一部分Region的集合,且不需要Region是连续的


3.G1能充分利用多CPU、多核环境硬件优势,尽量缩短STW
4.G1整体上采用标记-整理算法,局部是通过复制算法,不会产生内存碎片,因此不会因为分配大对象导致FullGC的发生。一般情况下G1是不会发生FullGC的
5.G1的停顿时间可预测,能明确指定在一个时间段内,消耗在垃圾收集上的时间不能超过多长时间
6.G1跟踪各个Region里面垃圾堆的价值大小,在后台维护一个列表,每次根据允许的时间来回收价值最大的区域,从而保证有闲时间内的高效收集。G1的回收叫MixedGC,会回收整个新生代及部分价值较高的老年代

G1跟CMS收集器相似,工作的时候也分成四个大的步骤:
1.初始标记:只标记GC Roots能直接关联到的对象;
2.并发标记:进行GC Roots Tracing的过程;判断哪些对象是垃圾对象
3.最终标记:修正并发标记期间,因程序运行导致标记发生变化的那一部分对象。(类似CMS的重新标记)
4.筛选回收:根据时间来进行价值最大化的回收。这一步并不是要把所有垃圾都收集完,而是根据时间要求,收集回收价值最大的区间

回收过程如下图所示:

回收前:

回收后: 

 G1收集器也有一些参数可以设置,比如下面两个,其它参数参见JVM规范。

可通过-XX:MaxGCPauseMillis设置最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间
可通过-XX:InitiatingHeapOccupancyPercent设置堆占用了多少的时候触发GC,默认为45%

 

 

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

JVM垃圾收集器总结 的相关文章

随机推荐

  • 数据库总结(七)

    数据库设计 7 1 数据库设计概述 1 数据库设计 数据库设计是指对于一个给定的应用环境 构造 设计 优化的数据库逻辑模式和物理结构 并据此建立数据库及其应用系统 使之能够有效地存储和管理数据 满足各种用户的应用需求 包括信息管理要求和数据
  • Spring AOP 剖析(6)

    Spring AOP 的底层实现机制 2 Spring AOP 中的 Pointcut 6 扩展 Pointcut 如何前面的 Pointcut 类型都无法满足要求 这种情况下可以扩展 Spring AOP 的 Pointcut 给出自定义
  • web复习之从头到尾看看(1)

    主要是一些我认为自己没有掌握的细节性问题 仅供参考 欢迎大家一起学习 留言 你认为最有可能考的内容 换行标签 lt gt 内加br br span 不能包含 div 与 p 超链接 a href 链接内容 target 在何处打开 self
  • Python绘制三角函数图像

    可以使用Python的matplotlib库来绘制三角函数图像 首先 定义一个x值的范围 然后使用matplotlib的plot 函数绘制三角函数 最后使用matplotlib的show 函数显示图像
  • HTML 取消input自动提示

    input 输入框有提示功能 当你之前输入过一些内容 你下次打入相关字符的时候 默认会有之前输入的一些相关的字符的提示 这个提示一般来说还是很好的 但是 有时候 我们想自己输入 不想要提示 如果不需要提示 则将 autocomplete设置
  • ubuntu的终端命令提示符太长的修改方法总结

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ubuntu的终端命令提示符太长 主要原因 1 计算机名太长 2 多层直接显示出来 针对计算机名太长的处理 如 下面的计算机名提示太长了 ningcaichen virtu
  • Java的byte类型详解

    前言 byte这个单词是Java八种基本数据类型之一字节的关键字 在计算机存储中以字节为单位 8位比特 bit 组成一个字节 为什么弄清楚byte这么重要呢 因为智能硬件的数据传输大部分协议都是按字节一位一位来解析的 对于字节的运算十分频繁
  • 备战蓝桥杯-二分查找(附多道题解和详细分析)

    二分典型例题 备战蓝桥杯系列全部文章 分享看过的高赞的文章 有助于你对于二分的理解 巨人的肩膀 知乎 二分的解释 LeetCode二分的解释 给定一个按照升序排列的长度为 nn 的整数数组 以及 qq 个查询 对于每个查询 返回一个元素 k
  • 直播邀约|8个数字了解2023腾讯全球数字生态大会

    2023腾讯数字生态大会 一起来看看吧
  • ❤ npm install 时报Error: spawn git ENOENT

    npm install 时报Error spawn git ENOENT 原因 主要是因为由于 git 的环境变量未设置导致 所以安装一下git 的环境变量就O了 步骤如下 设置 gt gt 系统 gt gt 高级系统设置 gt gt 高级
  • linux系统下修改文件夹目录权限

    文件夹权限问题 Linux Fedora Ubuntu修改文件 文件夹权限的方法差不多 很多人开始接触Linux时都很头痛Linux的文件权限问题 这里告诉大家如何修改Linux文件 文件夹权限 以主文件夹下的一个名为cc的文件夹为例 下面
  • nodejs第五天 npm yarn pnpm 包管理器

    文章目录 npm package json 安装包 全局安装 配置镜像 yarn 安装使用 镜像配置 pnpm 使用 镜像 npm node中的包管理器叫做npm node package manage 我们可以将自己开发的包上传到npm中
  • 数据结构--循环队列的c语言实现(超详细注释/实验报告)

    数据结构 循环队列的c语言实现 超详细注释 实验报告 知识小回顾 队列 Queue 是另一种限定性的线性表 它只允许再表的一端插入元素 而再另一端删除元素 多以队列具有先进先出 First In First Out FIFO 的特性 这与我
  • dmmbus地址_busdmm.us服务器iP

    2019 10 09 2020 12 19 173 252 100 21 2019 10 09 2020 12 19 31 13 74 1 2020 09 05 2020 12 19 104 244 43 208 2020 09 05 20
  • Mac系统创建python3.7虚拟环境

    mac系统python3 7安装虚拟环境 什么叫虚拟环境呢 python特有的一种软件环境 创建多个python环境 各个环境之间完全隔离 互不影响 它可以用来解决Python项目开发和运行过程中的依赖项和版本问题 而不必和其他项目的Pyt
  • dfs找不到网络路径 windows_DFS 复制服务已启动位于本地路径 C:\WINDOWS\SYSVOL\domain 上的 SYSVOL,并正在...

    公司新建域控由于分公司需要辅助域控 就新建了一台额外域控 但是该域控建好后发现组策略不生效 检查sysvol文件夹一片空白 肯定是没有从主域控复制过来 使用dcdiag检查 有下面报错 目录服务器诊断 正在执行初始化设置 正在尝试查找主服务
  • Android -- Activity and Intent

    Android Activity and Intent Activity Activity Lifecycle Intent 显式Intent 隐式Intent Intent属性 Intent Examples Activity activ
  • OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    人工智能学习离不开实践的验证 推荐大家可以多在FlyAI AI竞赛服务平台多参加训练和竞赛 以此来提升自己的能力 FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台 每周免费提供项目开源算法样例 支持算法能力变现以及快
  • 阿里云 日志服务接入

    目前项目中都有用到日志记录 一般会存到本地 但是时间长了 去删除也是很麻烦的 阿里云日志服务 是个不错的选择 可分为两种 自动采集和自动上传到云 1 写文件到本地 然后配置 让阿里云自动采集 LogHub 支持客户端 网页 协议 SDK A
  • JVM垃圾收集器总结

    JVM的垃圾收集算法 最终是要由垃圾收集器实现的 不同厂商 不同版本的虚拟机的垃圾收集器实现差别很大 本文只介绍HotSpot中的垃圾收集器 包括 串行收集器 并行收集器 新生代Parallel Scavenge收集器 CMS G1 一 整