JVM 新生代垃圾回收如何避免全堆扫描?

在 JVM 新生代的垃圾回收(Minor GC)过程中,为了提高效率并减少回收时间,垃圾收集器会避免对整个堆(包括新生代和老年代)进行扫描。以下是 JVM 如何实现这一优化的核心机制。


1. 全堆扫描的代价

全堆扫描意味着垃圾回收器需要遍历整个老年代的对象,寻找其中引用新生代对象的部分。这会导致以下问题:

  • 增加垃圾回收的耗时。
  • STW(Stop-The-World)暂停时间更长,影响应用性能。

2. 避免全堆扫描的机制

JVM 使用以下机制在新生代垃圾回收时避免全堆扫描:

2.1 分代垃圾回收策略

JVM 将堆分为 新生代老年代,并对新生代和老年代分别进行垃圾回收。这种分代回收策略本身减少了扫描范围,使得 Minor GC 只需关注新生代中的对象,而无需处理老年代中大部分对象。


2.2 卡表(Card Table)

  • 卡表是一种基于内存区域的记录结构,用于跟踪老年代中引用新生代的对象。
  • 堆内存被划分为许多小的卡片(Card),每张卡片对应一段内存区域。
  • 卡表的原理
    1. 当老年代的对象引用新生代对象时,对应的卡片会被标记为“脏卡”。
    2. 在 Minor GC 期间,垃圾回收器只需扫描卡表中被标记为脏卡的区域,而不是整个老年代。

示例:

假设老年代有 100 个对象区域,但只有 5 个区域的对象引用了新生代。通过卡表,GC 只需扫描这 5 个区域,而无需遍历整个老年代。


2.3 记忆集(Remembered Set, RSet)

  • 记忆集 是一种用于记录跨代引用的优化结构,跟踪老年代对新生代的引用。
  • 每个垃圾回收区域都维护一个记忆集,记录哪些老年代对象引用了当前区域内的新生代对象。
  • 作用
    • 记忆集将 GC 的扫描范围限制在老年代的少量引用上,从而避免全堆扫描。

2.4 根集跟踪(Root Set Tracking)

  • 在进行垃圾回收时,GC 首先从 GC Roots 开始扫描。GC Roots 包括:

    • 栈中的局部变量。
    • 静态变量。
    • JNI 引用。
  • GC Roots 不会直接涉及整个老年代,因此通过根集扫描也避免了全堆扫描。

3. 卡表与记忆集的关系

  • 卡表 是一种较为粗粒度的机制,基于内存地址范围进行标记。
  • 记忆集 则是较为精细的机制,直接记录具体的跨代引用。
  • 两者可以结合使用:卡表用于快速定位,记忆集用于精确扫描。

4. 垃圾回收器对优化的支持

以下是支持上述优化的常见垃圾收集器:

  • Serial GC 和 Parallel GC:使用卡表和根集扫描。
  • CMS(Concurrent Mark-Sweep):通过记忆集避免全堆扫描。
  • G1 GC:在每个分区(Region)中维护记忆集,同时结合卡表加速扫描。

5. 总结

JVM 新生代垃圾回收通过卡表、记忆集和根集跟踪等机制有效避免了全堆扫描。这些优化使 Minor GC 的执行时间显著减少,提高了系统的吞吐量和响应能力。

关键点:

  1. 卡表:快速标记老年代中引用新生代的区域。
  2. 记忆集:记录跨代引用的精确信息。
  3. 分代回收:限制回收范围,减少不必要的扫描。
  4. 根集跟踪:通过 GC Roots 启动扫描,进一步优化垃圾回收性能。

JVM 新生代垃圾回收如何避免全堆扫描?的更多相关文章

  1. JVM实用参数——新生代垃圾回收

    JVM实用参数目录 JVM实用参数——新生代垃圾回收 概述 第1部分  新生代垃圾回收介绍 第2部分 参数介绍 参考 第1部分  新生代垃圾回收介绍 本部分,我们将关注堆(heap) 中一个主要区域, ...

  2. JVM(三) 垃圾回收时间点和垃圾收集器

      收集器组合章节来自第一篇参考文章,非原创,作者总结地非常好!          分代收集相关概念来自参考文章第二篇,非原创         第二篇参考资料的文章质量很高,推荐阅读! 分代收集(Ge ...

  3. JVM虚拟机垃圾回收(GC)算法及优缺点

    一.什么是GC   GC是jvm的垃圾回收,垃圾回收的规律和原则为:   次数上频繁收集新生区(Young)   次数上较少收集养老区(Old)   基本上不动永久区(Perm) 二.GC算法(分代收 ...

  4. JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

     相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...

  5. 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

      相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...

  6. jvm虚拟机--垃圾回收子系统

    转载自cyc2018的github:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E8%99%9A%E ...

  7. JVM总结-垃圾回收(下)

    大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间. 之所以要提到这个假设,是因为它造就了 Java 虚拟机的分代回收思想.简单来说,就是将堆空间划分为两 ...

  8. JVM(九):垃圾回收算法

    JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...

  9. JVM G1垃圾回收算法简要介绍

    JVM G1垃圾回收算法简要介绍 G1的特点 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核) 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间) 尽可能地让GC时长可 ...

  10. Java学习之二(线程(了解) JVM GC 垃圾回收)

    线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...

随机推荐

  1. ORM(Object Relational Mapping:对象关系映射)

    了解orm,先了解以下概念: 什么是"持久化" 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的数据存 ...

  2. 个人数据保全计划:从印象笔记迁移到joplin

    前言 最近在探索各种现代化的笔记工具时,刚好用上了Joplin这款应用,尽管界面没那么好看,但开源.支持markdown.功能完善,而且还支持很多导入方法(事实上很多开源笔记都支持). 其中的导入功能 ...

  3. 使用天翼云云容器引擎CCE创建简单nginx服务

    本文分享自天翼云开发者社区<使用天翼云云容器引擎CCE创建简单nginx服务>,作者:b****n 一.创建一个nginx应用. 1.选择资源池,如[杭州2],进入云容器引擎CCE平台页面 ...

  4. Protobuf生成文件报错

    Mac下protobuf生成文件报错问题解决办法,windows下就不会这么麻烦了,如果linux下出现类似报错信息按照下面的解决逻辑依然适用. 1.由--go_out引发的报错 1.报错信息: us ...

  5. Q:ORACLE 之无法删除正在连接的用户?

    首先用户名必须用单引号引起来且必须大写,如下是失效的 1.查询用户进程 SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME='V7HIS_1'; 2.删除 ...

  6. JWT权限验证,兼容多方式验证

    前言 许久没写博文了,整合下这段时间所学吧,前进路上总要停下来回顾下学习成果. 本篇记录下项目的权限验证,WebApi项目中用权限验证来保证接口安全总是需要的,然而权限验证的方式多种多样,博主在项目中 ...

  7. VsCode安装Copilot详细教程

    安装GitHub Copilot插件前,您需要安装以下软件: 安装Visual Studio Code:前往https://code.visualstudio.com下载并安装最新版的Visual S ...

  8. Hadoop - [01] 概述

    Hadoop官网:https://hadoop.apache.org/ Hadoop下载:https://archive.apache.org/dist/hadoop/common/ 一.Hadoop ...

  9. 05_模块(import & from)

    模块(import & from) 导入模块 在和.py同级文件夹下创建一个自定义的模块 fibo.py def fib_return(x): a, b = 0, 1 result = [] ...

  10. 【ARM+Qt+OpenCV】基于ARM的双目图像采集系统

    点击查看代码 系统使用ARM处理器,运行linux系统,Qt创建工程编写主程序,可以使用OpenCV进行图像处理. 通过两个摄像头采集会图像,在LCD上进行显示,然后通过LCD上的按钮实现退出程序.保 ...