JVM之【GC-可达性分析算法】
在Java虚拟机(JVM)中,可达性分析算法(Reachability Analysis)用于垃圾收集,以确定哪些对象是“可达”的,即哪些对象仍然有用,哪些对象可以被回收。下面是对可达性分析算法及其底层实现的详细描述。
可达性分析算法概述
可达性分析算法通过从一组称为"根对象"(GC Roots)的对象开始,遍历对象引用图,确定哪些对象是可达的。那些无法从根对象访问到的对象被视为不可达的,可以被垃圾收集器回收。
根对象(GC Roots)
在JVM中,根对象包括以下几类:
- 虚拟机栈中的引用:包括各个线程的栈帧中的本地变量表中引用的对象。
- 方法区中的类静态属性引用的对象:即静态字段引用的对象。
- 方法区中的常量引用的对象:如字符串常量池中的引用。
- 本地方法栈中的引用:即JNI(Java Native Interface)引用的对象。
- 所有被同步锁synchronized持有的对象
所以!GC Roots是很多很多个的,而不要看到Roots就认为只有一个
可达性分析过程
可达性分析的过程可以概括为以下几个步骤:
- 标记阶段:
- 从GC Roots开始,将所有可达对象标记为活跃。
- 使用一种图遍历算法(如深度优先搜索DFS或广度优先搜索BFS)遍历对象引用图,找到所有可达对象。
- 清除阶段:
- 在标记阶段之后,所有未被标记的对象被视为不可达,可以被垃圾收集器回收。
- 如果要使用可达性分析算法来判断内存是否可回收,那么分析工作必须在一个能保障一致性的快照中进行。否则分析结果的准确性就无法保证
- 这也是导致GC时必须“Stop the World” 的一个重要原因!!
底层实现
-
对象引用图:
- JVM内部使用一种称为“对象图”的数据结构来表示对象及其相互引用关系。对象图中的每个节点表示一个对象,每条边表示一个对象对另一个对象的引用。
-
标记-清除算法(Mark-Sweep Algorithm):
- 标记阶段:Collector从GC Roots开始,遍历对象图,对所有访问到的对象进行标记。标记通常通过在对象头部设置标志位来实现。
- 清除阶段:Collector遍历堆中的所有对象,回收那些未被标记的对象。
- 缺点:
- 效率不高
- GC的时候需要stop整个应用程序
- 清理出来的内存不连续,即不会整合内存,而是复用垃圾对象的内存。会存在大量内存碎片
-
并发标记-清除算法:
- 在现代JVM中,为了减少垃圾收集带来的暂停时间(stop-the-world),通常会采用并发标记-清除算法。这些算法允许应用线程和垃圾收集线程同时工作。
- 三色标记法:是并发标记的一种实现方式,通过将对象标记为白色、灰色和黑色来实现。
- 白色:尚未访问的对象。
- 灰色:已访问但未处理完引用的对象。
- 黑色:已访问且引用已处理完的对象。
- 并发标记阶段:
- 初始标记:标记从根对象直接可达的对象,通常会短暂暂停所有应用线程。
- 并发标记:与应用线程并发运行,标记所有可达对象。
- 最终标记:处理并发标记期间产生的引用变化,通常会有短暂停顿。
- 清除阶段:回收未被标记的对象。
-
分代垃圾回收:
- JVM通常采用分代垃圾回收策略,将堆分为年轻代和老年代。不同代使用不同的回收算法以优化性能。
- 年轻代使用复制算法(复制存活对象到新的区域,回收旧区域的所有对象)。
- 老年代使用标记-清除或标记-整理算法(将存活对象压缩到一侧,回收剩余空间)。
根对象和其他对象的连接
-
引用链:
- 根对象通过引用链(Reference Chain)连接到其他对象。每个对象都有字段指向其他对象,这些字段形成了对象图中的边。
- 在标记阶段,算法通过引用链从根对象递归或迭代地访问其他对象。
-
栈和静态变量的引用:
- 虚拟机栈中的本地变量表和方法区中的静态变量表保存着对对象的直接引用。这些引用成为可达性分析的起点。
通过以上步骤和机制,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码值…...
树形结构-CRUD接口
先看一下效果:整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…...
【Qt知识】Qt窗口坐标系
Qt的窗口坐标体系遵循标准的计算机图形坐标系统规则 Qt窗口坐标体系特点 坐标原点:窗口坐标体系的原点位于窗口的左上角,即坐标(0, 0)位置。 轴方向: X轴:向右为正方向,随着X坐标值的增加,元素在窗口中从…...
SAP Build引言
前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台,最早的时候应该都是各自分开的几个产品,近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了,分别是SAP IRPA,SAP Workflow…...
2024上海国际钢丝绳及吊索具展览会
2024上海国际钢丝绳及吊索具展览会 2024 Shanghai International Wire Rope and Hanger Exhibition 时间:2024年12月18日--20日 地点:上海新国际博览中心 详询主办方陆先生 I38(前三位) I82I(中间四位ÿ…...
记一次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操作、网络请求、数据库查询等)完成时,继续执行其他任务。这与同步编程(或阻塞编程)…...
pytorch笔记:自动混合精度(AMP)
1 理论部分 1.1 FP16 VS FP32 FP32具有八个指数位和23个小数位,而FP16具有五个指数位和十个小数位Tensor内核支持混合精度数学,即输入为半精度(FP16),输出为全精度(FP32) 1.1.1 使用FP16的优缺…...
R语言ggplot2包绘制世界地图
数据和代码获取:请查看主页个人信息!!! 1. 数据读取与处理 首先,从CSV文件中读取数据,并计算各国每日收入的平均签证成本。 library(tidyverse) df <- read_csv("df.csv") %>% group_…...
【Linux】Linux的权限_1
文章目录 三、权限1. shell外壳2. Linux的用户3. Linux权限管理文件访问者的分类文件类型和访问权限 未完待续 三、权限 1. shell外壳 为什么要使用shell外壳 由于用户不擅长直接与操作系统直接接触和操作系统的易用程度、安全性考虑,用户不能直接访问操作系统。 什…...
日语_远程办公常用日语单词
基本词汇 リモートワーク(Rimōto Wāku):远程工作テレワーク(Terewāku):远程工作(Telework)在宅勤務(ざいたくきんむ,Zaitaku Kinmu)ÿ…...
MTK 平台项目security boot 开启/关闭 及 系统签名流程
以 https://online.mediatek.com/FAQ#/SW/FAQ26691 为基础做如下记录以做备忘: 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的使用 使用步骤 (1)创建数据源对象DataSource (2)给对象设置必要的属性 (3)和数据…...
【Qt】【模型视图架构】 在项目视图中启用拖放
文章目录 1. 在便捷类中启用拖放2. 在模型/视图类中启用拖放 模型/视图框架支持Qt的拖放应用。 列表、表格和树中的项目可以在视图中被拖拽,数据作为MIME编码的数据被导入和导出。标准视图可以自动支持内部的拖放。 默认视图的拖放功能并没有被启用,如果…...
B端产品无爆款,说有的都是忽悠和外行!
前言:网上经常有人讲运营,把C端那一套硬搬到B端,讲的自我陶醉,稍微有点常识的人就知道不能这么玩。 一、什么是B端和C端 B端(Business-to-Business)是指面向企业客户的市场和产品。B端产品或服务主要是为…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
