jvm垃圾回收机制原理读书笔记

2023-10-29

可达性分析

主要是用来解决哪些对象是不可用的,可以被回收。

以一系列称为GC Roots的对象为起点,若对象到GC Roots之间没有任何引用关系,则认为该对象是不可用的,可以被回收.

具体可作为GC Roots的对象如下(不是全部):

  1. **所有Java线程中当前栈帧的引用(例如局部变量),也就是活着的线程,**这个就是我们通常意义上Java代码new一个对象引用,这个对象引用所在的地方.
  2. 所有ClassLoader
  3. 所有全局变量

对于classloader和全局变量,因为其一定伴随着应用的整个生命周期,所以能从此处开始遍历。对于线程中局部变量,因为此时一定处于活跃状态,所以此处一定能遍历出去

常见的清除算法

主要是进行垃圾回收时怎么具体去操作内存,主要分为如下几种类型,但实际上虚拟机通常都是在不同的代上使用不同的算法组合实现。

标记-清除算法

首先标记所有需要被回收的对象,当标记完成之后,再统一清理。CMS收集器使用该算法实现。

该算法存在两个问题:

  1. 标记和清除的效率不高

  2. 清除的时候容易导致内存不连续, 产生内存碎片

复制算法

为了解决标记-清除算法时导致内存碎片的产生,可以将内存划分为相等的两部分(不一定相等,此处方便描述),每次只使用其中的一块,当这一块用完之后,将其中存活的对象复制到另外一份,同时清空这份内存。

HotSpot中新生代Eden,S0,S1的划分就是依据此算法实现,其划分比例默认是8:1。

该算法对于那些存活时间短的对象清除效率高,因为在复制的时候大部分对象都已经不可用了,所以复制的对象较少。但是对于存活时间长的对象由于需要多次进行复制操作,效率会变低。

该算法还有另外一个弊端, 需要额外占用一部分内存。

标记-整理算法

上述的复制算法对于存活时间长的对象不友好。该算法的标记过程与标记-清除算法一样,但是在清理的时候,将存活的对象向一端移动,然后清理掉在该边界之外的所有对象。

一般老年代使用此算法实现。

常见垃圾收集器

在JDK8中server模式下默认的是: Parallel Scavenge + Parallel Old(其实就是Parallel并行收集器,分为老年代和新生代)

下面具体分析JVM中几种垃圾收集器

Serial 串行收集

单线程执行。会stop the world,也就是在进行收集时,会暂停所有其他用户线程。

该收集器包括两个版本,一个是新生代收集器,使用复制算法;一个是老年代,使用标记-整理算法

Parallel 并行收集

并行执行。目的是达到一个可控制的吞吐量

其主要特点如下:

  • 并行执行
  • 能自适应堆中各个区域的大小关系
  • 目的是达到一个可控制的吞吐量

该收集器包括两个版本:

一个是新生代收集器, Parallel Scavenge,使用复制算法实现;

一个是Parallel Old, 使用标记-整理算法实现。

CMS

concurrent mark sweep, 是一个和用户线程并行执行的垃圾收集器。

目的是获取最短回收停顿时间

基于标记-清除算法实现。

其收集流程如下:

  1. 初始标记 该过程需要stop the world, 仅仅标记GC ROOTS直接关联的对象,所以很快
  2. 并发标记 该过程和用户线程并行执行,占用时间较长, 进行GC roots tracing, 也就是对象的可达性分析
  3. 重新标记 该过程需要stop the world,标记在并发标记阶段新产生的需要回收的对象,占用时间较短
  4. 并发清除 该过程进行清除,占用时间较长

整个过程中占用时间最长的是并发标记和并发清除两个阶段。

CMS收集器的缺点如下:

  1. 由于使用了标记-清除算法,会导致内存碎片产生
  2. 需要预留一部分内存空间给用户,用以进行并发标记
G1收集器

G1 的主要关注点在于达到可控的停顿时间,在这个基础上尽可能提高吞吐量

G1 和 CMS 相同的地方在于,它们都属于并发收集器,在大部分的收集阶段都不需要挂起应用程序。区别在于,G1 没有 CMS 的碎片化问题(或者说不那么严重),同时提供了更加可控的停顿时间。

如果应用使用了较大的堆(如 6GB 及以上)而且还要求有较低的垃圾收集停顿时间(如 0.5 秒),此时G1是个较好的选择。

在内存划分上,之前介绍的分代收集器将整个堆分为年轻代、老年代和永久代,每个代的空间是确定的。而 G1 将整个堆划分为一个个大小相等的小块(每一块称为一个 region),每一块的内存是连续的。

和分代算法一样,G1 中每个块也会充当 Eden、Survivor、Old 三种角色,但是它们不是固定的,这使得内存使用更加地灵活。这里的eden,survivor和old是一个标签,只是一个逻辑表示,不是物理表示。如下图所示, E, S, O和其他的收集器不一样, 并不是连续的, 可以间隔存在。

p

在JVM中,存活下来的对象被虚拟机从一个region里被移动到另一个region中。这些小块(region)的回收是并行回收的,期间其他的应用线程照常工作。

G1中还存在一种特殊类型的region,叫Humongous, 主要是用来存储那些比标准块大50%,甚至更大的对象。这些大对象被保存到一整块连续的区域。需要注意的是,该区域目前还没有被优化到最佳,所以尽量不要创建很大的对象。

G1收集器主要有如下几个特点:

  1. 并行与并发。 可以通过多个CPU使用并发的方式来进行工作
  2. 空间整合。 从整体上看G1是基于标记-整理算法进行清除, 但是在两个region之间, 是基于复制算法进行清除
  3. 可预测的停顿。这是G1的一大特点。用户可设置在一个时间段内, 消耗在垃圾收集上的时间不能超过多长时间。具体实现是因为G1在进行垃圾回收时,首先会对每个region进行估值(主要是根据回收能获取到的空间大小以及回收需要时间的经验值), 并维护一个优先列表, 这样每次在进行回收的时候,根据用户设置的回收时间, 优先回收价值较大的那些region(也就是garbage first)。

现在有一个问题, 如果某个对象被其他不在该region的对象所引用, 那么在做对象的可达性分析时, 难道需要扫描整个堆吗?

明显不可能每次扫描整个堆, 这样效率会很低。G1(包括CMS也是一样)会为每个region维护一个remembered set, 当对该region内的引用对象有写操作时, 会将相关的引用信息记录到remembered set中, 在可达性分析的根节点GC Roots加入这些remembered set, 就能避免全堆扫描。

G1收集器的工作流程和CMS有些类似, 具体如下:

  1. 初始标记。和CMS类似, 只标记GC Roots直接关联的对象,所以时间很短。需要stop the world
  2. 并发标记。对对象进行可达性分析,耗时较长, 和用户线程并发执行
  3. 最终标记。对并发比较阶段由用户线程新产生的对象进行重新标记,并和初始标记的结果进行合并。 需要stop the world。
  4. 筛选回收。对各个region进行估值, 然后根据用户设置的停顿时间制定回收计划。由于只是回收部分region且暂停用户线程可以提高回收效率, 所以一般上也是需要stop the world的。

G1收集器常见的一些参数说明如下:

  • ‐XX:+UseG1GC 使用G1收集器
  • ‐XX:G1HeapRegionSize 指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
  • ‐XX:G1NewSizePercent 新生代内存初始空间(默认整堆5%)
  • ‐XX:G1MaxNewSizePercent 新生代内存最大空间

参考资料:

深入理解Java虚拟机

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

jvm垃圾回收机制原理读书笔记 的相关文章

随机推荐

  • (笔记)googletest在C语言项目中的使用指南

    文章目录 0 背景 需求说明 0 1 需求 0 2 方法 0 3 构建 1 gtest文件层级划分与说明 1 1 单元测试运行方法 2 新增单元测试 2 1 新增模块测试 2 2 新增模块功能测试 3 单元测试具体实现 3 1 gtest
  • Matlab绘图时的几个小技巧(修改刻度线长度、添加/去掉右边和上面的轴与刻度线、出图时去掉旁边的空白部分)

    set gca TickLength 0 005 0 035 修改坐标轴刻度线的长度 box on 开启右面和上面的坐标轴 box off 关闭右面和上面的坐标轴 set gca LooseInset 0 0 0 0 删除掉图旁边多余的空白
  • 技术至简-8:调制解调到底是什么样的数学运算?---从时域和频域两个角度看调制解调的本质

    目录 1 从时域的角度看调制 原始信号与载波信号的相乘 2 从频率的角度看调制 原始信号的频谱搬移到载波信号的频谱附近 3 从时域的角度看解调 调制后信号与载波信号的相乘 4 从频率的角度看解调 把载波频谱附近的原始信号的频谱搬移到原始信号
  • 单极性非归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真

    这篇博客是用MATLAB仿真观察二进制数字信号码元速率和它的带宽的关系 书上给了数字基带信号和频带信号的功率谱密度 但是我还没搞明白FFT与功率谱密度的关系 所以博客里图片的信号幅值就不要纠结啦 看包络形状和带宽就行 如果有明白FFT与功率
  • k8s之Informer Store、Indexer、ThreadStore详解

    Store 在 Informer 中 Store 提供了将存储对象的能力 而 Indexer 在 Store 的基础上又提供了可以自定义索引来查询对象的功能 Store 接口提供的功能比较直观 主要是用于对对象的增删改查 包括Indexer
  • Docker 之MySQL 重启,提示Error response from daemon: driver failed programming external connectivity on **

    今天刚刚修改基于Docker服务的MySQL配置参数 准备重新加载MySQL 容器 提示如下截图的错误信息 root localhost docker restart 7d98a59a8012 Error response from dae
  • 【Vue】【01】vue环境搭建

    1 环境安装 https nodejs org zh cn 选择长期维护版 下载完成下一步下一步安装 建议选择版本低的行安装 2 cmd命令 node v npm v 3 淘宝镜像cnpm npm install g cnpm regist
  • 如何使用GPT2中文闲聊对话系统,机器人对话,自动对话!

    目录 目录结构 运行环境 首次运行 如何训练自己的模型 数据预处理 训练模型 如何确定这个 val num数值 编辑 编辑最后说明 打算做一个微博自动评论的一个模型 假象可以模拟回复粉丝 或者评论其他微博 首先下载GPT2模型代码 http
  • 运维实践

    欢迎关注 WeiyiGeek 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 全栈实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 作者主页 ht
  • (已解决) org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, “staffId“)

    问题现象 今天在项目中遇到一个mybatis的报错 org apache ibatis ognl OgnlException source is null for getProperty null staffId 这是我之前从未遇到过的问题
  • 如何结合FT2232HL/CMSIS-DAP+Eclipse+OpenOCD软硬件工具使用SWD调试接口在Windows10操作系统在线调试S32K3XX(Cortex M7)

    由于我们公司自己需要开发烧录工具 本人通过google搜相关文档和看ARM公司的技术文档 终于实现了这个功能 因为涉及的内容知识点比较多 对于玩嵌入式MCU的小白来说要普及的知识 逐个介绍篇幅会比较长 本文中只介绍相应的关键知识点 篇幅有相
  • 大家好,这里是第一篇博客文章!

    大家好 我的第一篇CSDN博客与大家见面了 去年曾经在班级微信公众平台写过一篇关于MySql的安装及配置的推送 周围同学的反响还都不错 想着为今后找到一个技术分享交流的平台 也能够快速地增删改查已发布的文章 并且进行有效的沟通交流 便开通了
  • 面向对象的设计原则

    开放封闭原则 软件实体 类 模块 函数等 应该可以扩展 但是不可修改 大白话 就是面对新需求时 现有的类最好不做修改 以增加新的类的方式来完成新需求 这样方便维护和扩展 依赖倒转原则 抽象不应该依赖细节 细节应该依赖于抽象 1 高层模块不应
  • 慕课:软件测试各章节答案

    说明 1 该课程为西北工业大学的软件测试的慕课 2 绿色选项为正确答案 题目后括号中的答案为本人的作答 对的用绿色标示 错的用红色标示 与错题集类似 第一章 软件测试基础 1 软件测试目的是什么 ABC A 修正软件错误和缺陷提高软件质量
  • NUC980开源项目29-W25N01挂载YAFFS2文件系统

    上面是我的微信和QQ群 欢迎新朋友的加入 配置内核 取消ramdisk 设置Boot option set bootargs noinitrd root dev mtdblock2 rootfstype yaffs2 rootflags i
  • 互连线的阻抗不连续

    前言 保持互连通道的阻抗连续性 是信号完整性设计的一项重要内容 互连通道中如果存在阻抗不连续点 不仅会引起待传输信号本身的反射 而且可能还会放大其他方面因素的影响 例如串扰噪声耦合到邻近线 在临近线上传播 如果邻近线上存在多处不连续点 串扰
  • 亲密关系-【有效表达】-如何完善自己的表达思路?

    有效沟通三步 1 正面假设 2 区分感受和结论 3 区分请求和命令 案例 最近工作压力大 跟老公说我需要他安慰 他却觉得我作 还说最近是不是闲的 你需要安慰 老公理解的是 老公说你作 你听到的是 攻击 不想再表达 你听到这件事 想说些什么
  • 关于数据治理ChatGPT是如何回答的?

    这两天你的朋友圈是不是被火爆全网的ChatGPT霸屏了 你是不是已经迫不及待感受过ChatGPT带来的惊喜 那你知道ChatGPT是什么吗 面对掀起的一波话题热潮 好奇使然 小编去特别关注了一下最近火热的ChatGPT 看看这是何方神圣 竟
  • openvas漏洞扫描器

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 openvas简介 二 作用 三 安装及使用 openvas架构 在这里插入图片描述 https img blog csdnimg cn f46eba30a8a
  • jvm垃圾回收机制原理读书笔记

    可达性分析 主要是用来解决哪些对象是不可用的 可以被回收 以一系列称为GC Roots的对象为起点 若对象到GC Roots之间没有任何引用关系 则认为该对象是不可用的 可以被回收 具体可作为GC Roots的对象如下 不是全部 所有Jav