JVM知识点整理

JVM

  • 回收哪个区域?
      • 关联面试题:fullgc会回收方法区(元空间)吗?
  • 怎么判断对象可以被回收了
    • 关联面试题:哪些对象可以作为 GC Root (两栈两方法)
  • JVM GC什么时候执行?
  • 分代回收机制
    • 思考:假如eden区80m,老年代200m,一个对象90m?
    • 各区域触发垃圾回收的类型与解释
      • 新生代
        • 新生代GC收集(类比倒水)
      • 老年代(为什么老年代的回收耗时,比新生代更长呢)
      • 跨代引用的问题
      • 方法区
  • 回收算法讲解
    • 标记 - 清除算法
    • 标记 - 复制算法
    • 标记 - 整理算法
  • 常用的垃圾回收器
    • Serial/Serial Old
    • ParNew( 负责收集新生代区域)
    • Parallel Scavenge
    • Parallel Old
    • CMS
      • CMS 负责收集老年代区域,它采用**标记-清除**算法。
    • G1
      • 运行步骤
    • 三色标记(解决或降低用户线程的停顿)
        • 原理流程
      • 最终标记和重新标记解决了什么?
        • 漏标
        • 多标
        • 读屏障、写屏障
        • CMS通过写屏障卡表解决
        • G1写屏障rset解决
        • RSet就是卡表的实现,卡表是数组,而RSet是HashTable。

回收哪个区域?

JVM GC只回收堆区和方法区内的基本类型数据和对象。

栈区的数据(仅指基本类型数据),在超出作用域后会自动出栈释放掉,所以其不在JVM GC的管理范围内。

关联面试题:fullgc会回收方法区(元空间)吗?

1.常量对象不再任何地方被引用的时候,这个常量可以被回收
2.无用类(堆中不存在该类的任何实例对象,加载该类的类加载器已经被回收,Class对象不在任何地方被引用)

怎么判断对象可以被回收了

对象不可达

GC Roots 作为起始节点,从这些节点开始,根据引用关系向下搜索,搜索过程的就是一条引用链,没有在这个链条上面的对象,也就是根节点通过引用链不可达到这个对象时,就认为这个对象是可以被回收的。

关联面试题:哪些对象可以作为 GC Root (两栈两方法)

  • 虚拟机栈中引用的对象
  • 本地方法栈中 JNI引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
public class StaticObj {
    public static Object obj = new Object();
    
    //...
}
public class ConstObj {
    public static final String STR = "hello";
    
    //...
}

JVM GC什么时候执行?

  • 老年代空间不足
  • 方法区空间不足
  • Eden区和s区不足
  • 手动触发gc

分代回收机制

弱分代假说:绝大多数对象都是朝生夕死的。
强分代假说:熬过越多次的垃圾回收的对象,就越难消亡

思考:假如eden区80m,老年代200m,一个对象90m?

老年代的担保机制,如果一个对象大于设定的值那么直接丢到老年代中。
除此之外,当存活的对象超过Survivor空间大小时,这些存活的对象会忽略年龄,直接进入老年代里。

各区域触发垃圾回收的类型与解释

  • Minor GC:只回收新生代区域。
  • Major GC:只回收老年代区域。只有CMS实现了MajorGC,所以在老年代里,触发GC,除了CMS和G1之外的其他收集器,大多数触发的其实是 Full GC
  • Full GC:回收整个堆区和方法区
  • Mixed GC:回收整个新生代和部分老年代。G1收集器实现了这个类型。

新生代

默认情况下,新生代(Young generation)、老年代(Old generation)所占空间比例为 1 : 2 。
包含1个伊甸园空间(Eden), 2个幸存者空间(Fron Survivor、To Survivor)
Eden : Fron : To = 8 : 1 : 1
适合使用标记-复制算法

新生代GC收集(类比倒水)

新创建的对象,是保存在伊甸园空间的(Eden)。那些经历多次GC依然存活的对象会经由幸存者空间(Survivor)转存到老年代空间(Old generation)

老年代(为什么老年代的回收耗时,比新生代更长呢)

1、老年代内存占比更大,所以理论上回收的时间也更长
2、老年代使用的是标记-整理算法,清理完成内存后,还得把存活的对象重新排序整理成连续的空间,成本更高

跨代引用的问题

卡表(Card Table)
每一个卡页,可能会包含N个存在跨区域引用的对象,只要存在跨区域引用的对象,这个卡页就会被标识为1。当GC发生的时候,就不需要扫描整个区域了,只需要把这些被标识为1的卡页加入对应区域的 GC Roots 里一起扫描即可。

方法区

之前引用的面试题已经说明过,这边再重新说明一次
1.常量对象不再任何地方被引用的时候,这个常量可以被回收
2.无用类(堆中不存在该类的任何实例对象,加载该类的类加载器已经被回收,Class对象不在任何地方被引用)

回收算法讲解

标记 - 清除算法

标记出所有存活的对象,再扫描整个空间中未被标记的对象直接回收。

标记 - 复制算法

把内存分成两块大小相同的空间(1 : 1),每次只使用其中一块,当使用中的这块内存用完了,就把存活的对象移动到另一块内存中,再把使用过的这块内存空间一次性清理掉。(依照eden区、survivor区思考)
缺点:这个做法虽然效率极高,但也浪费了一半的内存空间。

标记 - 整理算法

和标记-清除算法一样,先标记,但清除之前,会先进行整理,把所有存活的对象往内存空间的左边移动,然后清理掉存活对象边界以外的内存,即完成了清除的操作。

常用的垃圾回收器

Serial/Serial Old

一个单线程工作的收集器。在进行垃圾回收的时候,需要暂停所有的用户线程,直到回收结束。

ParNew( 负责收集新生代区域)

ParNew 就是 在Serial 收集器的基础之上,实现了它的多线程版本。

Parallel Scavenge

和 ParNew 很相似,都是新生代的收集器,支持多线程并行回收,也同样是使用标记-复制来作为回收算法。
区别:实现一个可控制吞吐量的垃圾收集器。

Parallel Old

Parallel Old 是 Parallel Scavenge 的老年代版本

CMS

CMS 负责收集老年代区域,它采用标记-清除算法。

  1. 初始标记
    STW,GC Root直接关联的对象
  2. 并发标记
    并发标记从GC Roots直接关联的对象开始,遍历整个引用链,这个阶段耗时较长,但用户线程可以和GC线程一起并发执行。
  3. 重新标记
    STW,重新标记就是修正用户线程继续运行,导致的变动的那一部分对象
  4. 并发清理

缺陷:
1.内存碎片。由于使用了 标记-清理 算法,回收结束后会产生大量不连续的内存空间,也就是内存碎片。
2.GC进行时会降低吞吐量。
3.浮动垃圾。CMS有两个阶段是可以用户线程和GC线程并发执行的,用户线程的继续执行自然会伴随垃圾的不断产生,这些就是浮动垃圾。这些垃圾只能等下次触发GC的时候才能清除了

G1

G1 收集器的设计理念是:实现一个停顿时间可控的低延迟垃圾收集器。

G1 依然遵循分代回收的设计理论,但它对堆(Java Heap)内存进行了重新布局,不再是简单的按照新生代、老年代分成两个固定大小的区域了,而是把堆区划分成很多个大小相同的区域(Region),新、老年代也不再固定在某个区域了,每一个Region都可以根据运行情况的需要,扮演Eden、Survivor、老年代区域、或者Humongous区域。

运行步骤

1.初始标记
只标记 GC Roots 能直接关联的对象
2.并发标记
从根节点(GC Root)开始,顺着引用链遍历整个堆,找出存活的对象。这个步骤耗时较长,但用户线程可以和GC线程并发执行。
3.最终标记
处理并发标记阶段,用户线程继续运行产生的引用变动,这个阶段需要暂停用户线程,支持并行处理。
4.筛选回收
计算出各个Region的回收价值和成本,再根据用户期望的停顿时间来决定要回收多少个Region。
回收使用的是复制算法,把需要回收的这些Region里存活的对象,复制到空闲的Region中,然后清理掉旧Region全部空间。

三色标记(解决或降低用户线程的停顿)

原理流程

初始标记
在这里插入图片描述
并发标记
在这里插入图片描述
在这里插入图片描述

此时黑色对象就是存活的对象,白色对象就是已消亡可回收的对象。

最终标记和重新标记解决了什么?

漏标

在这里插入图片描述
D此时所有引用已经扫描过,但是此时D->G,但是对于GC线程来说,是不知道这个引用的,就会产生漏标。

多标

在这里插入图片描述
D->E 引用断开,E、F、G不可达。

读屏障、写屏障

在读写前后,将变动节点记录下来(对象 G) 给记录下来。(可以想象成AOP)

CMS通过写屏障卡表解决

卡表是一个与Java堆大小相同的数组,每个元素记录着相应内存区域是否被修改。当 当对一个对象引用进行写操作时(对象引用改变),写屏障逻辑将会标记对象所在的卡页为dirty。垃圾收集器会检查卡表中所有“dirty”条目所对应的内存区域。

G1写屏障rset解决

Remembered Set(RSet),它是一种专门针对并发标记整理算法的优化,它能够更方便和高效地记录所有引用了老年代对象的新生代对象,避免了传统卡表方式在处理跨代引用时需要全局扫描卡表的缺点。
当某个Region的对象被修改时,处理这个Region的线程需要扫描该Region的RSet,找到其他Region中指向该Region的对象。

RSet就是卡表的实现,卡表是数组,而RSet是HashTable。

RSet是Points-into(谁引用了我)
解决跨代引用问题,记录region之间的引用关系。从而可以通过本region的Rset快速找到存活的对象。
CMS是Points-out(我引用了谁的对象)
并发标记阶段会把这些发生变化的对象所在的Card标识为Dirty,这样后续阶段就只需要扫描这些Dirty Card的对象,从而避免扫描整个老年代。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker容器启动的问题 - docker容器和虚拟机的比较 - docker的底层隔离机制

目录 一、docker容器启动的问题? 二、什么是docker仓库? 三、虚拟机和docker容器的区别: docker的优势: docker的缺点: 对比: 四、docker的底层隔离机制 参考文献:LXC linux容器简介——…

图像 检测 - CenterNet: Objects as Points (arXiv 2019)

CenterNet: Objects as Points - 目标作为点(arXiv 2019) 摘要1. 引言2. 相关工作3. 准备工作4. 目标作为点4.1 3D 检测4.2 人体姿态估计 5. 实施细节6. 实验6.1 目标检测6.1.1 附加实验 6.2 3D 检测6.3 姿态估计 7. 结论References附录A:模型…

【C数据结构】动态顺序表_SeqList

目录 【1】数据结构概述 【1.1】什么是数据结构? 【1.2】数据结构分类 【1.3】数据结构术语 【2】数据结构特点 【2】动态顺序表 【2.1】动态顺序表定义数据结构和接口 【2.1】动态顺序表创建初始化 【2.2】动态顺序表初始化 【2.3】动态顺序表内存释放 【…

mac电脑储存内存越来越小如何清理释放空间?

如果你是一位Mac系统的用户,可能会发现你的电脑储存空间越来越小。虽然Mac系统设计得非常优秀,但是系统数据和垃圾文件也会占据大量的储存空间。在这篇文章中,我们将探讨mac系统数据怎么这么大,以及mac清理系统数据怎么清理。 一…

万字详解常用设计模式

本文是博主在工作中对常用设计模式的使用经验总结归纳而来分享给大家。 设计模式一共有23种,本文讲解涉及如下: 责任链模式 模板方法模式 发布订阅模式 策略模式 三大分类 业界一般将设计模式分为三大类: 创建型模式:对类的实…

5、产品经理的工作职责OR主要工作技能和工具

1、产品经理的工作职责 我们通过一个案例来了解产品经理的工作职责。 老板让你给他点餐,你应该怎么做?你需要考虑哪一些方面的问题? 例如:你预算多少,预算是十块钱还是100块还是1000块。有没有忌口,口味…

Kafka详解(一)

第1章 Kafka概述 1.1 定义 1.2 消息队列 目前企业中比较常见的消息队列产品主要有Kafka、ActiveMQ、RabbitMQ、RocketMQ等。Message Queue ② 在大数据场景主要采用Kafka作为消息队列 ② 在JavaEE开发中主要采用ActiveMQ、RabbitMQ、RocketMQ Kafka存储数据,且保证…

「网络编程」第一讲:初识网络_网络基础1

「前言」文章是关于网络编程方面的,今天内容大致是网络基础,讲解下面开始! 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 青山不改,绿水长流 ——白居易 目录 一、…

新手快速搭建springboot项目

一、创建项目 1.1、创建项目 1.2、配置编码 1.3、取消无用提示 1.4、取消无用参数提示 二、添加POM父依赖 <!-- 两种方式添加父依赖或者import方式 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-p…

微信小程序触底加载scroll-view

微信小程序触底加载 scroll-view 了解什么是触底加载&#xff1f; 需求&#xff1a;有个固定高度的容器&#xff0c;实现容器里面的内容触底加载 1、内容盒子的高度 2、盒子里内容的总高度 3、滚动条的scrollTop 触底加载的原理就是 当里面的容器触底的时候进行分页&#xff0…

Ansible-playbook-roles安装lnmp

使用roles安装lnmp 1、准备四台主机 192.168.142.10 192.168.142.20 192.168.142.30 192.168.142.40 2、10作为ansible管理端 首先ssh连接剩下三台主机 3、vim/etc/ansible/hosts 添加[nginxservers]配置nginx ip,[phpservers]php ip,[mysqlservers]mysql ip 4、cd /etc/ansibl…

0基础学习VR全景平台篇第42篇:编辑器底部菜单-分组管理

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;底部菜单—分组管理功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 分组管理&#xff0c;指观看者可点击不同分组&#xff0c;查看不同类型全景内容…

【ROS】ROS+Gazebo强化学习:训练

1、安装ROS1 【ROS】Ubuntu20.04安装ROS1 2、安装Anaconda 【AI】PyTorch入门&#xff08;一&#xff09;&#xff1a;通过Anaconda安装PyTorch 【PyThon】Anaconda常用命令 3、源码下载 使用论文 Goal-Driven Autonomous Exploration Through Deep Reinforcement Learnin…

Springboot整合Camunda工作流引擎实现审批流程实例

环境&#xff1a;Spingboot2.6.14 camunda-spring-boot-starter7.18.0 环境配置 依赖配置 <camunda.version>7.18.0</camunda.version> <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boo…

Redis-缓存

新增或者更新数据时,创建以后顺便存到redis中去【维护缓存】 获取的时候先从redis缓存中拿数据 如果拿数据的时候为空,则到数据库中拿数据,后再存到redis缓存中去 大量的商品【包括冷门商品】都进行上面的缓存,那么就很耗内存 针对每个数据进行缓存的时候 维护一个过期时间…

计算服务资源调度管理

文章目录 前言总体架构“ULT”和“KLT”抽象“内核”“容器”“虚容器” 内存抽象虚拟存储&#xff08;容器调用&#xff09; 多机器调度 前言 今天复习了一下操作系统&#xff0c;系统过了一下&#xff0c;感觉还有点时间&#xff0c;那么顺便来讨论一下&#xff0c;关于我的…

使用VScode + clangd 阅读 c/c++ 源码环境搭建

使用Vscode clangd 阅读c/c源码 一、需求 在嵌入式软件开发的工作中&#xff0c;我们常常需要分析C/C代码&#xff0c;比如linux kernel 的代码&#xff0c;而公司的代码一般都会存放在服务器中&#xff0c;服务器一般是linux&#xff0c;且无法联网&#xff0c;我们只能通过…

qt creator使用问题

qt creator 多版本安装需要(单独下载qtcreator安装版本)&#xff0c;安装目录默认在Qt目录下&#xff08;qt的sdk也在qt目录下&#xff09; 编译过程中遇到一些很奇怪问题&#xff0c;建议优先重新编译。 issue qtcreator inappropriate for the inferior 构建套件&#x…

我准备蓝桥杯的这一年

我准备蓝桥杯的这一年 文章目录 我准备蓝桥杯的这一年起步和目标确定渐入佳境焦虑疲惫&#xff0c;一天又一天国赛我来力总结 我将我这段 流水账分为四个阶段。谨以此文&#xff0c;祭奠我这一年来的焦虑、白发~ &#xff0c;最终也取得了预期的成绩。不知未来再看此章会作何感…

网络编程重点

1>OIS 7层模型 用户空间&#xff1a;应用层 7>提供各种网络接口 表示层 6>数据表示&#xff0c;加密与压缩 会话层 5>主机之间会话管理 内核空间&#xff1a;传输层 4&…