JVM知识点整理

这篇具有很好参考价值的文章主要介绍了JVM知识点整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回收哪个区域?

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全部空间。

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

原理流程

初始标记
JVM知识点整理
并发标记
JVM知识点整理
JVM知识点整理

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

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

漏标

JVM知识点整理
D此时所有引用已经扫描过,但是此时D->G,但是对于GC线程来说,是不知道这个引用的,就会产生漏标。

多标

JVM知识点整理
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的对象,从而避免扫描整个老年代。文章来源地址https://www.toymoban.com/news/detail-487828.html

到了这里,关于JVM知识点整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JVM知识点(一)

    JVM知识点(一)

    1、JVM基础概念 (1)JVM、JRE、JDK JRE:JVM+基本类库组成的运行环境就是JRE。JVM自己是无法完成一次编译,处处运行的,需要有一个基本类库告诉JVM如何操作运行,如如何操作文件,连接网络等,JVM运行时,会一次性加载基本类库; JDK:JDK中除了包含JRE,同时还包含一些小工具

    2024年02月11日
    浏览(8)
  • JVM相关知识点

    Java可以跨平台的原因是因为它使用了Java虚拟机(JVM)作为中间层。Java源代码首先被编译成字节码,然后由JVM解释执行或即时编译成本地机器代码。这样,在不同的操作系统上,只需要安装适合该操作系统的JVM,就可以运行相同的Java程序。JVM提供了一个抽象的执行环境,使得

    2024年02月08日
    浏览(8)
  • JVM知识点(二)

    JVM知识点(二)

    1、G1垃圾收集器 -XX:MaxGCPauseMillis=10,G1的参数,表示在任意1s时间内,停顿时间不能超过10ms; G1将堆切分成很多小堆区(Region),每一个Region可以是Eden、Survivor或Old区;这些区在内存上不是连续存放的; 每一块Region大小都是相同的,大小为1-32M,若Region对象存储不下,大小超

    2024年02月11日
    浏览(9)
  • JVM知识点汇总(2)

    目录 一. 垃圾回收的优点和原理. 并考虑两种回收机制 二. 垃圾回收器的基本原理是什么? 垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收? 三. Java 中会存在内存泄露嘛? 请简单描述 四.Ststem.gc() 和 Runtime.gc() 会做什么事情 五. finalize() 方法是什么时候

    2024年02月12日
    浏览(9)
  • Mysql知识点整理

    什么是Mysql; Mysql常用的存储引擎有什么?它们有什么区别? 数据库的三大范式; Mysql的数据类型有哪些? Mysql的索引: 什么是Mysql索引? 索引的优缺点 索引的数据结构 Hash索引和B+树索引的区别 索引类型有哪些? 索引的种类有哪些? B树和B+树的区别? 数据库为什么使用

    2023年04月12日
    浏览(11)
  • 复习知识点整理

    复习知识点整理

    1.导入某个文件夹的index文件,index可以省略(这里导入的是router和store文件下的index.js文件) 2.路由懒加载 this 1.在vue文件中使用routerstore对象时 2.在js文件中使用routerstore对象时 使用什么需要导入时候,挂载在vue全局对象上的对象在vue文件中可以使用,在js文件中不能使用

    2024年04月08日
    浏览(13)
  • 分块矩阵知识点整理:

    分块矩阵知识点整理:

    1.分块方法:横竖线不能拐弯,思想为将矩阵分块看作向量计算 2.标准型         不一定是方的         特殊性:经过分块后会出现单位矩阵和0矩阵 3.分块矩阵的运算:         1.加减乘的运算与向量运算相同 4.分块矩阵求转置:         1.将子块看作普通元素求转置    

    2024年02月01日
    浏览(6)
  • Docker知识点整理

    Docker知识点整理

    传统的虚拟机,可以虚拟出一条硬件,运行一个完整的操作系统,在这个操作系统上安装和运行所需的软件 容器内的应用可以直接运行在宿主 主机的内核中,容器没有自己的内核,也不用虚拟硬件 (轻便) 每个容器是相互隔离的,每个容器内都有属于自己的文件系统,之间

    2024年02月03日
    浏览(9)
  • Redis知识点整理

    第一部分:Redis基础知识点 1、数据类型 5种常用基础类型:string,hash,list,set,zset – 字符串,Hash表,List顺序集合,Set无序集合,ZSet有序集合 3中特殊类型:bitmap-字节地图, hyperloglog-统计日志,geospatial-地理位置计算 2、底层数据结构 String: 基于SDS字典结构 Hash表 : 由zipList/qui

    2024年02月10日
    浏览(14)
  • AMC12和高考数学哪个更难?知识点有哪些不同?

    AMC12和高考数学哪个更难?知识点有哪些不同?

    AMC12和高考数学哪个更难?知识点有哪些不同?今天小编给大家来详细介绍一下! 难度对比 从难度上看, 高考数学的计算量更大,并且知识点比AMC10/12超前,需要用到极限和微积分的知识。 反观AMC10/12不需要用到微积分的知识,并且计算量不如高考数学大,但特别考察学生的

    2024年02月08日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包