GC的两种判定方法:引用计数与引用链

运维:你们 JAVA 服务内存占用太高,还只增不减!告警了,快来接锅 先点赞再看,养成好习惯 某天,运维老哥突然找我:“你们的某 JAVA 服务内存占用太高,告警了!GC 后也没释放,内存只增不减,是不是内存泄漏了!” 然后我赶紧看了下监控,一切正常,距离上次发版好几天了,FULL GC 一次没有,YoungGC,十分钟一次,堆空闲也很充足。 运维:“你们这个服务现在堆内存 used 才 800M,但这个 JAVA 进程已经占了 6G 内存了,是不是你们程序出啥内存泄露的 bug 了!” 我想都没想,直接回了一句:“不可能,我们服务非常稳定,不会有这种问题!” . 阅读详情

通过优锐课核心java学习笔记中,我们可以看到GC的两种判定方法,码了很多专业的相关知识, 分享给大家参考学习。

Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。

因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。
随着越来越多的服务器程序采用Java技术,例如JSP,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。

Java是如何管理内存

为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。
监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。
为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。
以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。
在这里插入图片描述

Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。这种方式的优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度很低(很难处理循环引用的问题),但执行效率很高。
在java中可以作为GC Roots的对象有以下几种:
栈中引用的对象
方法区中静态成员或者常量引用的对象(全局对象)
JNI方法栈中引用对象 总体来说就是,全局中的引用(例如常量或者静态属性)与执行上下文(例如栈帧中的本地变量表)。

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以加入我的java学习群(374308445)来交流学习,里面都是同行,群验证【优快云2】有资源共享。

JVM中引用计数法与可达性分析_引用计数法和可达性分析 有些人认为方法区(如HotSpot虚拟机种的元空间或者永久代)是没有垃圾收集行为的,《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在(如JDK 11时期的ZGC收集器就不支持类卸载),方法区垃圾收集的“性价比”通常也是比较低的:在Java堆中,尤其是在新生代中,对常规应用进行一次垃圾收集通常可以回收70%至99%的内存空间,相比之下,方法区回收囿于苛刻的判定条件,其区域垃圾收集的回收成果往往远低于此。 阅读详情

相关推荐

垃圾标记阶段--引用计数算法、可达性分析算法

前言: 对象存活判断 在垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有对死亡对象的标记才会被GC释放空间,因此这个过程可以称为垃圾标记阶段。 简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象的存活一般有两种方式:引用计数算法 和 可达性分析算法。 一、引用计数算法(Java未使用) 1、原理: 引用计数算法,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就

qq_43012792的博客 1万+

java内存管理

内存泄漏的问题 http://www.iceshi.com/bbs/forum_posts.asp?TID=907&PID=3189文章出处:不详 作者:欧阳辰 (yeekee@sina.com) 周欣 (zhouxin@sei.pku..)一问题的提出 Java的一个重要优点就是通过垃圾收集器(Garbage Collection,GC)自动管理内存的回收,程序员不需要通过调用函数来...

237

JVM垃圾对象判定:从GC Roots到引用链,彻底搞懂对象存活与回收

在Java后端开发与性能调优中,理解JVM如何判定一个对象是否为垃圾,是解决内存泄漏、Full GC频繁等问题的前提。可达性分析通过GC Roots遍历引用链,比引用计数更可靠地识别不可达对象;而对象在回收前还可能经历finalize自救和软、弱、虚等引用类型的差异化处理。掌握这些原理后,结合堆转储分析与卡表、写屏障等现代收集器机制,就能定位对象未被回收的根因,并为缓存、线程池等场景设计更稳健的内存策略。本文从基础概念讲到工程实践,帮助开发者系统掌握垃圾对象判定这一JVM核心命题。

weixin_29973493的博客 203

JVM

定义: Java Virtual Machine - java 程序的运行环境 (java二进制字节码的运行环境) 好处: 一次编译到处执行 (屏蔽了字节码和底层操作系统之间的差异,对外提供了一致的运行环境) 自动内存管理,垃圾回收功能 数组下标越界检查 多态 (提升程序的可扩展性) 1.程序计数器 Program Counter Register 程序计数器(寄存器) 1.2 作用 左边是二进制字节码 jvm 指令 右边是 java源代码 由二进制字节码经过解释器解释成->机械码

qq_45399013的博客 277

LoadRunner性能测试系统学习教程:GC回收机制(10)

本文介绍了LoadRunner性能测试中的GC回收机制,主要讲解JVM如何判断对象可被回收。判断依据包括对象未被引用、作用域异常、程序正常结束等。重点分析了两种垃圾回收算法:引用计数法(通过计数器跟踪引用次数)和可达性分析算法(基于GC Root对象判断可达性)。文章还详细说明了finalize()方法在对象回收过程中的作用机制,包括两次标记过程以及F-Queue队列的处理流程。

m0_60889254的博客 850

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3137

win10下定时运行和开机自启动jar包

需求说明: 1.jar包开机自启动 2.jar包每隔一段时间重启 运行环境:win10

爱学习的诸葛铁锤的博客 1804

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1332

03-GC对象的两种判定方法(如何判断对象已死)?

为了解决引用计数法的循环引用问题,Java 使用了可达性分析的方法。通过一系列的“GC roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就会回收, 但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)的情况。

鸣鼓ming的博客 266

vivado下ECO操作-不重新综合实现修改属性并生成.bit

ECO即engineer change order,即工程变更指令,可以对设计做局部小改动并只对改动部分重新布局布线并生成.bit。在一个工程动辄编译几个小时情况下,可以在调试中节省大量时间。比如我们在调试中,需要改变时钟占空比或者相位,需要改变寄存器初值等等,此时用ECO暂时改动,待验证后在重新编译无疑是最有效率的方法。 实现ECO通常有两种方式,一是通过vivado界面完成,另一种方法就是tcl脚本。所有的ECO操作都可以通过tcl操作完成,有的操作用vivado界面无法完成,只能通过tcl。以下主要

4657

手把手教你学simulink实例--基于Simulink的航空航天器飞行轨迹规划与仿真详细介绍

航空航天器飞行轨迹规划是实现高效、安全和精确飞行的关键技术。通过Simulink进行航空航天器飞行轨迹规划与仿真,可以验证控制算法的有效性、优化飞行路径,并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个航空航天器飞行轨迹规划系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的航空航天器飞行轨迹规划与仿真系统。该系统能够根据实时环境变化动态调整飞行轨迹,从而提高飞行效率、降低燃料消耗并提升安全性。

MHD0815的博客 388

JVM-GC (一)

JVM-GC GC的判定方法 引用计数法 指的是某一个地方引用这个对象,这个对象就加1,如果失效就减1,当计数为0的时候就开始回收,但是JVM并不使用引用计数法,因为存在无法判定的情况,如AB相互之间引用的情况会失去判断。 引用链法 通过一种GC ROOT对象来判断,如果存在GC ROOT就说明对象还在引用,否则说明可以进行回收该对象。 GC的收集方法 标记清除、标记整理、复制算法 ...

weixin_43421142的博客 183

记录:解决Ubuntu20.04安装ros报错E: Unable to locate package ros-kinetic-desktop-full【亲测有效】

报错:E: Unable to locate package ros-kinetic-desktop-full.尝试好久一直都无法下载,最后得知真相的我眼泪哗哗的直流。

**My Coding Family** 6万+

Java面试之JVM篇

实际面试中遇到,形式的话有书面解答也有口述。一般侧重点是JVM的内存模型,GC的判定,GC收集方法,java 中垃圾收集的方法有哪些?1)JVM的内存模型2)GC的判定3)java中垃圾收集的方法有哪些?如图由以下几部分构成:1)线程私有的数据区,包括程序计数器、虚拟机栈和本地方法栈三个区域2)线程共享的数据区(Java堆和方法区)3)本地方法栈(Native Method Stack)1)引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为0就会回收但是JVM没有用这种方式,因为无法

q66562636的博客 183

YOLOv10改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 103

aic8800出现insmod: can‘t insert ‘/lib/modules/4.9.191/aic8800_fdrv.ko‘: No such device

2、如果单独编译wifi驱动,则把CONFIG_PLATFORM_UBUNTU?= y都改为CONFIG_PLATFORM_ALLWINNER?1、如果把wifi驱动嵌入到内核编译,则在makefile中加入这一句。后面再修改对应平台的交叉编译链和内核吗路径等。

mantouyouyou的博客 510

GC对象的判定方法

GC对象的判定方法 判断一个对象是否存活有两种方法: 引用计数法   所谓引用计数法就是给每一个对象设置一个引用计数器,每当有一 个地方引用这个对象时,就将计数器加一,引用失效时,计数器就减一。当一个对象的引用计数器为零时,说明此对象没有被引用, 也就是“死对象”,将会被垃圾回收.   引用计数法有一个缺陷就是无法解决循环引用问题,也就是说当对象 A 引用对象 B,对象 B 又引用者对象 A,那么此时 A、B 对象的引用计数器都不为零,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。 可达性

zhang_java_11的博客 779

YOLOv11知识蒸馏,实现无损涨点,包含逻辑蒸馏和特征蒸馏中的不同蒸馏方法,适用专栏内的所有模型

知识蒸馏(Knowledge Distillation)是由 Hinton 等人在 2015 年提出来的,主要是用一个复杂的教师模型去指导一个简单的学生模型训练,这样能让学生模型在保持高精度的同时,还能减少计算量。本文便是讲解如何针对的原始模型以及改进后的模型进行知识蒸馏,轻松实现无损涨点。知识蒸馏的核心在于利用已训练好的复杂模型(教师模型)去指导一个更简单的模型(学生模型)进行训练,以此让学生模型在保留较高精度的同时,降低计算成本。特征蒸馏(Feature Distillation)是知识蒸馏的一种形式,

Limiiiing的博客 4959

Carson带你学JVM:Java对象如何判断存活原则-引用计数法 & 引用链法

本文将全面讲解判断Java对象存活的方式,希望你们会喜欢

Carson带你学Android 5615

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

GC 的两种判定方法

在Java中,垃圾收集(Garbage Collection, GC)是自动管理内存的重要机制。GC的主要任务是识别并回收不再使用的对象,以释放内存资源。为了实现这一目标,JVM使用了多种对象存活判定算法。

weixin_45422672的博客 449

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

GC对象的判定和GC算法

本文系统性地介绍了GC对象的判定和GC算法

JayLaiSCUT的博客 2936

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

GC如何判定对象已死

即使在可达性分析法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑阶段”,要真正宣告一个对象死亡,至少要经历两次标记过程;6、Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如 NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。被判定为需要执行的对象将会被放在一个队列中进行第二次标记,除非这个对象与引用链上的任何一个对象建立关联,否则就会被真的回收。(Native 方法)中引用的对象。1、虚拟机栈(栈帧中的。

张紫娃的博客 518

GC的判定的2种方式

注:参考 https://blog.youkuaiyun.com/qq_1681163/article/details/52277380 https://blog.youkuaiyun.com/u014142287/article/details/51424725 java的四种引用https://www.cnblogs.com/huajiezh/p/5835618.html对象是否死亡的2中判定方法:引用计数和可达性分...

imooc_000000的博客 2325

如何判断对象是否死亡?(两种方法)

如何判断对象是否死亡?(两种方法) 堆中几乎存放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象需要回收(也就是死亡,不能再被任何途径使用的对象)。 有两种方法来判断。 1、引用计数法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器就减1;任何时刻计数器为0的对象就是不可能再被使用的。 我们能看出来引用计数法原理简单,判定高效,但是在Java领域...

hello_cmy的博客 2105
上一篇: 面试题解答系列:java newCachedThreadPool 线程池使用在什么情况下?
下一篇: 两个对象相互引用会不会被GC?
程序员plus
博客等级 码龄8年 41粉丝 151原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值