JVM 新生代垃圾回收如何避免全堆扫描?
JVM 新生代垃圾回收如何避免全堆扫描?
在 JVM 新生代的垃圾回收(Minor GC)过程中,为了提高效率并减少回收时间,垃圾收集器会避免对整个堆(包括新生代和老年代)进行扫描。以下是 JVM 如何实现这一优化的核心机制。
1. 全堆扫描的代价
全堆扫描意味着垃圾回收器需要遍历整个老年代的对象,寻找其中引用新生代对象的部分。这会导致以下问题:
- 增加垃圾回收的耗时。
- STW(Stop-The-World)暂停时间更长,影响应用性能。
2. 避免全堆扫描的机制
JVM 使用以下机制在新生代垃圾回收时避免全堆扫描:
2.1 分代垃圾回收策略
JVM 将堆分为 新生代 和 老年代,并对新生代和老年代分别进行垃圾回收。这种分代回收策略本身减少了扫描范围,使得 Minor GC 只需关注新生代中的对象,而无需处理老年代中大部分对象。
2.2 卡表(Card Table)
- 卡表是一种基于内存区域的记录结构,用于跟踪老年代中引用新生代的对象。
- 堆内存被划分为许多小的卡片(Card),每张卡片对应一段内存区域。
- 卡表的原理:
- 当老年代的对象引用新生代对象时,对应的卡片会被标记为“脏卡”。
- 在 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 的执行时间显著减少,提高了系统的吞吐量和响应能力。
关键点:
- 卡表:快速标记老年代中引用新生代的区域。
- 记忆集:记录跨代引用的精确信息。
- 分代回收:限制回收范围,减少不必要的扫描。
- 根集跟踪:通过 GC Roots 启动扫描,进一步优化垃圾回收性能。
JVM 新生代垃圾回收如何避免全堆扫描?的更多相关文章
- JVM实用参数——新生代垃圾回收
JVM实用参数目录 JVM实用参数——新生代垃圾回收 概述 第1部分 新生代垃圾回收介绍 第2部分 参数介绍 参考 第1部分 新生代垃圾回收介绍 本部分,我们将关注堆(heap) 中一个主要区域, ...
- JVM(三) 垃圾回收时间点和垃圾收集器
收集器组合章节来自第一篇参考文章,非原创,作者总结地非常好! 分代收集相关概念来自参考文章第二篇,非原创 第二篇参考资料的文章质量很高,推荐阅读! 分代收集(Ge ...
- JVM虚拟机垃圾回收(GC)算法及优缺点
一.什么是GC GC是jvm的垃圾回收,垃圾回收的规律和原则为: 次数上频繁收集新生区(Young) 次数上较少收集养老区(Old) 基本上不动永久区(Perm) 二.GC算法(分代收 ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...
- jvm虚拟机--垃圾回收子系统
转载自cyc2018的github:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E8%99%9A%E ...
- JVM总结-垃圾回收(下)
大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间. 之所以要提到这个假设,是因为它造就了 Java 虚拟机的分代回收思想.简单来说,就是将堆空间划分为两 ...
- JVM(九):垃圾回收算法
JVM(九):垃圾回收算法 在本文中,我们将从概念模型的角度探讨 JVM 是如何回收对象,包括 JVM 是如何判断一个对象已经死亡,什么时候在哪里进行了垃圾回收,垃圾回收有几种核心算法,每个算法优劣是 ...
- JVM G1垃圾回收算法简要介绍
JVM G1垃圾回收算法简要介绍 G1的特点 能够像CMS垃圾回收算法一样并发操作应用线程(潜台词:多核) 无需太长时间即可压缩空闲内存空间(潜台词:不会引起太多的GC停顿时间) 尽可能地让GC时长可 ...
- Java学习之二(线程(了解) JVM GC 垃圾回收)
线程与进程(了解)→JVM→字节码→GC 一.程序 = 算法 + 数据结构(大佬) 二.程序 = 框架 + 业务逻辑(现实) 1.线程与进程.同步与异步 1.1进程是什么? 进程就是操作系统控制的基本 ...
随机推荐
- CP56Time2A时间转换
* CP56Time2A时间格式 该时标格式使用7个字节来表示时间信息,上图的表中体现为--从最左侧8所在的行开始,到下面56所在的行,共7行.每一行表示一个字节,每行从右向左依次是该字节的第一位(最 ...
- LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中)
大家好,我是忍者程序员.上一篇文章我们讨论了如何科学地刷题,今天我要带大家深入了解这100道精选题目背后的分类逻辑.作为一名面试官,我希望通过这篇文章,为大家绘制一张完整的算法知识地图. 为什么要按类 ...
- SPICE协议浅析
本文分享自天翼云开发者社区<SPICE协议浅析>,作者:王****均 云环境中根据使用场景不同,有多种远程控制台传输协议,如SPICE.VNC.RDP等. SPICE是Simple Pro ...
- CDN在互联网直播中的运用与性能优化
本文分享自天翼云开发者社区<CDN在互联网直播中的运用与性能优化>,作者:不知不觉 随着互联网技术的不断发展,互联网直播已成为人们获取信息.娱乐.学习等多种需求的重要途径之一.然而,在直播 ...
- Centos7下oracle12c的安装与配置
一.硬件资源配置(虚拟机) CentOS7@VMware Workstation 10 Pro,分配资源:CPU:2颗,内存:4GB,硬盘空间:20GB+30GB 二.软件环境配置 软件上传 xshe ...
- Luogu P9869 NOIp2023 三值逻辑 题解 [ 绿 ] [ 带权并查集 ]
三值逻辑:有点坑并且细节较繁琐,但有点板子的并查集. 修改操作 发现对于每个点,只有对他的最后一次操作才是有用的,所以记录下最终的祖先即可. 然而这里并不能用并查集来实现,因为并查集它具有的是传递性, ...
- C语言程序设计手写笔记
最近自己录了一个自学C语言系列,笔记发出来,视频还在传
- 支付宝云Serveless+豆包AI实现AI日语学习APP
1. 引言 最近学日语,发现动词.形容词的变形规则又多又复杂,在不同语境里变化也不一样,句子结构和语法也很麻烦.为了提高学习效率,决定开发基于AI的日语学习APP,借助 AI 进行辅助学习,目前已经完 ...
- [SCOI2007] 蜥蜴 题解
发现实际上就是在求有多少只蜥蜴能逃出来. 发现可以将柱子拆成入点和出点两部分,自己的出点向别人的入点连边,自己的入点向自己的出点连边.最后再加一个超级源点 \(S\),连接所有有蜥蜴的柱子入点:再加一 ...
- linux下安装 elasticsearch
一.基础环境 操作系统环境:Red Hat Enterprise Linux Server release 6.4 (Santiago) ES版本:elasticsearch-7.8.0-linux- ...