当前位置: 首页 > news >正文

JVM之【GC-可达性分析算法】

在Java虚拟机(JVM)中,可达性分析算法(Reachability Analysis)用于垃圾收集,以确定哪些对象是“可达”的,即哪些对象仍然有用,哪些对象可以被回收。下面是对可达性分析算法及其底层实现的详细描述。

可达性分析算法概述

可达性分析算法通过从一组称为"根对象"(GC Roots)的对象开始,遍历对象引用图,确定哪些对象是可达的。那些无法从根对象访问到的对象被视为不可达的,可以被垃圾收集器回收。

根对象(GC Roots)

在JVM中,根对象包括以下几类:

  1. 虚拟机栈中的引用:包括各个线程的栈帧中的本地变量表中引用的对象。
  2. 方法区中的类静态属性引用的对象:即静态字段引用的对象。
  3. 方法区中的常量引用的对象:如字符串常量池中的引用。
  4. 本地方法栈中的引用:即JNI(Java Native Interface)引用的对象。
  5. 所有被同步锁synchronized持有的对象

所以!GC Roots是很多很多个的,而不要看到Roots就认为只有一个

可达性分析过程

可达性分析的过程可以概括为以下几个步骤:

  1. 标记阶段
    • 从GC Roots开始,将所有可达对象标记为活跃。
    • 使用一种图遍历算法(如深度优先搜索DFS或广度优先搜索BFS)遍历对象引用图,找到所有可达对象。
  2. 清除阶段
    • 在标记阶段之后,所有未被标记的对象被视为不可达,可以被垃圾收集器回收。
  • 如果要使用可达性分析算法来判断内存是否可回收,那么分析工作必须在一个能保障一致性的快照中进行。否则分析结果的准确性就无法保证
  • 这也是导致GC时必须“Stop the World” 的一个重要原因!!

底层实现

  1. 对象引用图

    • JVM内部使用一种称为“对象图”的数据结构来表示对象及其相互引用关系。对象图中的每个节点表示一个对象,每条边表示一个对象对另一个对象的引用。
  2. 标记-清除算法(Mark-Sweep Algorithm)

    • 标记阶段:Collector从GC Roots开始,遍历对象图,对所有访问到的对象进行标记。标记通常通过在对象头部设置标志位来实现。
    • 清除阶段:Collector遍历堆中的所有对象,回收那些未被标记的对象。
    • 缺点
      • 效率不高
      • GC的时候需要stop整个应用程序
      • 清理出来的内存不连续,即不会整合内存,而是复用垃圾对象的内存。会存在大量内存碎片
  3. 并发标记-清除算法

    • 在现代JVM中,为了减少垃圾收集带来的暂停时间(stop-the-world),通常会采用并发标记-清除算法。这些算法允许应用线程和垃圾收集线程同时工作。
    • 三色标记法:是并发标记的一种实现方式,通过将对象标记为白色、灰色和黑色来实现。
      • 白色:尚未访问的对象。
      • 灰色:已访问但未处理完引用的对象。
      • 黑色:已访问且引用已处理完的对象。
    • 并发标记阶段:
      • 初始标记:标记从根对象直接可达的对象,通常会短暂暂停所有应用线程。
      • 并发标记:与应用线程并发运行,标记所有可达对象。
      • 最终标记:处理并发标记期间产生的引用变化,通常会有短暂停顿。
    • 清除阶段:回收未被标记的对象。
  4. 分代垃圾回收

    • JVM通常采用分代垃圾回收策略,将堆分为年轻代和老年代。不同代使用不同的回收算法以优化性能。
    • 年轻代使用复制算法(复制存活对象到新的区域,回收旧区域的所有对象)。
    • 老年代使用标记-清除或标记-整理算法(将存活对象压缩到一侧,回收剩余空间)。

根对象和其他对象的连接

  1. 引用链

    • 根对象通过引用链(Reference Chain)连接到其他对象。每个对象都有字段指向其他对象,这些字段形成了对象图中的边。
    • 在标记阶段,算法通过引用链从根对象递归或迭代地访问其他对象。
  2. 栈和静态变量的引用

    • 虚拟机栈中的本地变量表和方法区中的静态变量表保存着对对象的直接引用。这些引用成为可达性分析的起点。

通过以上步骤和机制,JVM能够有效地识别和回收不可达的对象,从而管理堆内存并保证应用程序的正常运行和性能。

相关文章:

JVM之【GC-可达性分析算法】

在Java虚拟机(JVM)中,可达性分析算法(Reachability Analysis)用于垃圾收集,以确定哪些对象是“可达”的,即哪些对象仍然有用,哪些对象可以被回收。下面是对可达性分析算法及其底层实…...

【机器学习】——驱动智能制造的青春力量,优化生产、预见故障、提升质量

目录 一.优化生产流程 1.1 数据收集 1.2 数据预处理 1.3 模型训练 1.4 优化建议 1.5 示例代码 二.预测设备故障 2.1 数据收集 2.2 数据预处理 2.3 模型训练 2.4 故障预测 2.5 示例代码 三.提升产品质量 3.1 数据收集 3.2 数据预处理 3.3 模型训练 3.4 质量提升…...

Python实用代码片段分享(三)

在今天的博文中,我们将继续分享一些Python编程中非常实用的代码片段。这些代码片段将帮助你更高效地处理常见任务,从字符转换到数据类型检查,应有尽有。 1. ord函数和chr函数 Python的ord()函数可以返回Unicode字符对应的ASCII码值&#xf…...

树形结构-CRUD接口

先看一下效果:整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…...

【Qt知识】Qt窗口坐标系

Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点:窗口坐标体系的原点位于窗口的左上角,即坐标(0, 0)位置。 轴方向: X轴:向右为正方向,随着X坐标值的增加,元素在窗口中从…...

SAP Build引言

前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台,最早的时候应该都是各自分开的几个产品,近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了,分别是SAP IRPA,SAP Workflow&#xf…...

2024上海国际钢丝绳及吊索具展览会

2024上海国际钢丝绳及吊索具展览会 2024 Shanghai International Wire Rope and Hanger Exhibition 时间:2024年12月18日--20日 地点:上海新国际博览中心 详询主办方陆先生 I38(前三位) I82I(中间四位&#xff…...

记一次mysql索引优化

生产日志告警出现一条慢 sql 告警, 通过 sql 监控平台拿到 这条sql 语句是 : SELECTid,report_id,report_detail_id,item_code,report_type,photo FROM**** 表 WHEREdel_flag 0 AND (report_type 1 AND report_detail_id IN ( 1742 )) 之后用 explain 分析这条 sql 的命中…...

【Javascript系列】Terser通过调用API来实现代码的压缩和优化功能

Terser通过调用API来实现代码的压缩和优化功能 起源通过API来调用API调用过程中的一个隐含的技术点 - 异步调用和Promise对象官方文档中的一个有点容易忽略和混淆的地方关于Promise 起源 书接 上回,对Terser的功能做了一个初步的探索。在官方的主页上,有…...

嵌入式期末复习

一、选择题(20) 二、判断题(10) 三、填空题(10) 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…...

生信算法7 - 核酸序列Fasta和蛋白PDB文件读写与检索

python 3.9实现以下算法。 1. 简单的写文件和读文件 # 写 file1 open(count.txt,w) file1.write(this is a test) file1.close()# 读 file2 open(my_file) print(file2.read())2. 将列表内容写入文本文件 # 生成100-500数字列表 data [i * 100 for i in range(1, 6)] pri…...

【Python】Python异步编程

Python 异步编程 异步编程 异步编程是一种编程范式,通过非阻塞的方式执行任务,允许程序在等待某些操作(如I/O操作、网络请求、数据库查询等)完成时,继续执行其他任务。这与同步编程(或阻塞编程&#xff09…...

pytorch笔记:自动混合精度(AMP)

1 理论部分 1.1 FP16 VS FP32 FP32具有八个指数位和23个小数位,而FP16具有五个指数位和十个小数位Tensor内核支持混合精度数学,即输入为半精度(FP16),输出为全精度(FP32) 1.1.1 使用FP16的优缺…...

R语言ggplot2包绘制世界地图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 1. 数据读取与处理 首先&#xff0c;从CSV文件中读取数据&#xff0c;并计算各国每日收入的平均签证成本。 library(tidyverse) ​ df <- read_csv("df.csv") %>% group_…...

【Linux】Linux的权限_1

文章目录 三、权限1. shell外壳2. Linux的用户3. Linux权限管理文件访问者的分类文件类型和访问权限 未完待续 三、权限 1. shell外壳 为什么要使用shell外壳 由于用户不擅长直接与操作系统直接接触和操作系统的易用程度、安全性考虑&#xff0c;用户不能直接访问操作系统。 什…...

日语_远程办公常用日语单词

基本词汇 リモートワーク&#xff08;Rimōto Wāku&#xff09;&#xff1a;远程工作テレワーク&#xff08;Terewāku&#xff09;&#xff1a;远程工作&#xff08;Telework&#xff09;在宅勤務&#xff08;ざいたくきんむ&#xff0c;Zaitaku Kinmu&#xff09;&#xff…...

MTK 平台项目security boot 开启/关闭 及 系统签名流程

以 https://online.mediatek.com/FAQ#/SW/FAQ26691 为基础做如下记录以做备忘&#xff1a; How to Enable/Disable Secure Boot for Security 3.0: 1、 How to Enable Path Enable Preloader /vendor/mediatek/proprietary/bootable/bootloader/preloader/custom/{…...

JDBC连接MySQL

目录 1.数据库编程的必备条件 2.Java的数据库编程JDBC 3.JDBC的工作原理 4.第三方库connector的下载和导包 5.JDBC的使用 使用步骤 &#xff08;1&#xff09;创建数据源对象DataSource &#xff08;2&#xff09;给对象设置必要的属性 &#xff08;3&#xff09;和数据…...

【Qt】【模型视图架构】 在项目视图中启用拖放

文章目录 1. 在便捷类中启用拖放2. 在模型/视图类中启用拖放 模型/视图框架支持Qt的拖放应用。 列表、表格和树中的项目可以在视图中被拖拽&#xff0c;数据作为MIME编码的数据被导入和导出。标准视图可以自动支持内部的拖放。 默认视图的拖放功能并没有被启用&#xff0c;如果…...

B端产品无爆款,说有的都是忽悠和外行!

前言&#xff1a;网上经常有人讲运营&#xff0c;把C端那一套硬搬到B端&#xff0c;讲的自我陶醉&#xff0c;稍微有点常识的人就知道不能这么玩。 一、什么是B端和C端 B端&#xff08;Business-to-Business&#xff09;是指面向企业客户的市场和产品。B端产品或服务主要是为…...

IBM Plex字体家族全攻略:企业级开源字体的应用与实践

IBM Plex字体家族全攻略&#xff1a;企业级开源字体的应用与实践 【免费下载链接】plex The package of IBM’s typeface, IBM Plex. 项目地址: https://gitcode.com/gh_mirrors/pl/plex 企业级字体解决方案的价值解析 在数字产品设计中&#xff0c;字体作为视觉传达的…...

GreenLuma 2025 Manager:Steam游戏库管理工具的一站式解决方案

GreenLuma 2025 Manager&#xff1a;Steam游戏库管理工具的一站式解决方案 【免费下载链接】GreenLuma-2025-Manager An app made in python to manage GreenLuma 2025 AppList 项目地址: https://gitcode.com/gh_mirrors/gr/GreenLuma-2025-Manager GreenLuma 2025 Man…...

【FMCW雷达】频率调制连续波FMCW雷达系统(从波形生成到利用小胞平均常误报率CA-CFAR进行目标检测)【含Matlab源码 15242期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…...

TP4056充电板实战避坑指南:从LED状态误判到TEMP脚悬空,新手最容易踩的5个坑

TP4056充电板实战避坑指南&#xff1a;从LED状态误判到TEMP脚悬空&#xff0c;新手最容易踩的5个坑 第一次使用TP4056充电板时&#xff0c;我盯着闪烁的LED灯陷入了困惑——为什么充满电后红灯还亮着&#xff1f;为什么电池发热异常&#xff1f;这些问题让我意识到&#xff0c;…...

Java程序员的云原生时代生存指南:面向软件测试从业者的专业视角

在技术浪潮的冲击下&#xff0c;云原生已从概念演进为产业标准。对于广大Java程序员而言&#xff0c;这既是挑战也是机遇。传统的技术栈和开发模式正在经历深刻变革&#xff0c;而软件测试作为保障质量的关键环节&#xff0c;其理念与实践也随之迭代。 一、 挑战审视&#xff…...

Omni-Vision Sanctuary 企业级部署架构设计:高可用与弹性伸缩

Omni-Vision Sanctuary 企业级部署架构设计&#xff1a;高可用与弹性伸缩 1. 企业级AI部署面临的挑战 当企业决定在生产环境中部署Omni-Vision Sanctuary这类AI服务时&#xff0c;通常会遇到几个关键挑战。首先是服务可用性问题&#xff0c;任何计划外停机都可能直接影响业务…...

Phi-3 Forest Laboratory操作系统知识问答系统:从进程管理到文件系统详解

Phi-3 Forest Laboratory操作系统知识问答系统&#xff1a;从进程管理到文件系统详解 你有没有过这样的经历&#xff1f;翻开一本厚厚的操作系统教材&#xff0c;满篇都是“进程调度算法”、“虚拟内存”、“文件系统结构”这些抽象概念&#xff0c;看得人头晕眼花。或者&…...

多个source、多个sink

关键配置&#xff1a;sink的&#xff1a;plugin_input ["source_data1", "source_data2"]对应模型┌──────────┐│ Source A │──┐└──────────┘ │├──▶ Sink┌──────────┐ ││ Source B │──┘└──────…...

H3C IRF 四台交换机堆叠实战:环型拓扑配置详解

1. 四台H3C交换机IRF堆叠入门指南 第一次接触H3C交换机的IRF堆叠功能时&#xff0c;我完全被它的强大所震撼。简单来说&#xff0c;IRF&#xff08;Intelligent Resilient Framework&#xff09;技术可以把多台物理交换机虚拟成一台逻辑设备&#xff0c;不仅简化管理&#xff…...

PvZ Toolkit:植物大战僵尸PC版终极修改器使用指南

PvZ Toolkit&#xff1a;植物大战僵尸PC版终极修改器使用指南 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中资源不足而烦恼吗&#xff1f;PvZ Toolkit是一款专为植物大战僵尸…...