回顾GC是如何判断哪个对象应该被回收问题

jvm性能调优 - 22JVM GC回顾 前面二十几篇分析了JVM的核心运行原理,还有JVM GC的工作原理 同时,结合案例分析了JVM什么情况下会出现GC的问题,平时我们说优化JVM,到底是在说优化JVM的什么东西 。 这里我们来总结一下 阅读详情

一 概述

Java程序中,当一个对象没有被其它对象引用时,则该对象对于虚拟机而言就应该被回收的对象,其占用的内存空间需要被释放,同时对象也会被销毁。

二 判断对象应该被回收的具体算法

1. 引用计数算法

该算法通过判断对象的引用数量来决定对象是否可以被回收,在此机制下,堆中每个对象都存在一个引用计数器,当一个对象创建后被分配一个引用之后则对应的引用计数器加1,当引用完成后则引用计数器相应的减1,当某个对象的引用计数器为0的时候后,则会被虚拟机作为垃圾进行回收,并释放其所占用的内存空间。

优点:引用计数算法的执行效率高,程序执行所受的影响较小。

缺点:引用计数算法无法检测出循环引用(父对象引用子对象,子对象引用父对象),其内存空间无法被回收,从而导致内存泄漏。

2. 可达性分析算法

该算法通过判断对象的引用链是否可达来决定对象是否会被作为垃圾进行回收。

该算法是从离散数学的图论中引入,将程序的所有引用作为一张图,通过将一些GC Roots对象作为起始点,从这些结点开始向下搜索,搜索所做过的路径被称为引用链,如果某个GC Roots没有与任何引用链相连,则称GC Roots到该对象为不可达,此时该对象可以作为垃圾进行回收,然后释放其所占据的内存空间。

三 GC Roots实例

  • 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数,局部变量,临时变量等。
  • 在方法区中类静态属性引用的对象,如Java类的引用类型静态变量。
  • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。
  • 在本地方法栈中JNI(即通常所说的Native方法)引用的对象,。
  • 所有别同步锁(synchronized关键字)所持有的对象。
  • Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointException,OutOfMemoryError)等,还有系统类加载器。
Java GC 基础知识快速回顾 Java GC 是内存管理的重要机制,了解其基本概念、原理和调优方法,有助于提升应用性能和稳定性。通过合理配置和优化,可以有效减少 GC 停顿时间,提高应用吞吐量。 阅读详情

相关推荐

【大厂突击】六、Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC 一文搞懂

Minor GC、Young GC、Full GC、Old GC、Major GC、Mixed GC 一文搞懂

关注我带你大厂突击 2012

学习笔记-20230606-JavaGC如何判断对象可以被回收

可达性算法中的不可达对象并不是立即死亡的,对象拥有一次自我拯救的机会。中,创建的字符串对象实际上是存储在堆内存中的,而在虚拟机栈中,只是存储了一个指向该对象的引用(即变量`str`的值),而不是实际的对象本身。在 Java 中,方法区中常量引用的对象通常是指被 final 修饰的静态变量的值,也就是在编译期间确定的常量,被存储在常量池中,并在运行期间被直接引用。同样地,创建的数组对象实际上是存储在堆内存中的,而在虚拟机栈中,只是存储了一个指向该对象的引用(即变量`arr`的值),而不是实际的对象本身。

一个菜鸟从零基础学JAVA的过程 949

先别急着怪GC:Java GC问题的性能标尺、触发原因解码与根因判定解析

接口毛刺出现时,GC常被第一个怀疑,却未必是元凶。本文先用单次停顿不超过TP9999、GC吞吐不低于99.99%两条约束,把SLA换算成每分钟6毫秒的停顿预算;再对照JDK 8到25的HotSpot源码解读GCCause,并在JDK 8上实测13种触发场景,发现禁用显式GC会连带屏蔽jcmd GC.run,JNI临界区可引发462次Full GC;又用一小时仿真比较时序、概率、实验、反证四种判因方法,揭示混杂与时长偏倚陷阱;最后按Mutator类型、九类问题和排查难度给出定位思路与适用范围。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 17万+

如何判断对象可被GC回收?

判断对象可被GC回收有两种办法分别是:引用计数算法和根可达性算法。

w259149的博客 2517

给跨代引用记一本账:Java GC 的分配路径、卡表写屏障与收集器版图快速回顾

本文把 Java GC 的零散名词串成一条推理链路:从 TLAB 指针碰撞分配、逃逸分析,到 Eden、Survivor 与晋升的四条路,重点拆解卡表与写屏障如何为老年代指向新生代的引用记账,及 Minor GC 如何只扫脏卡。基于 JDK 8 实测:分散写使 Young GC 停顿涨 10~15 倍,条件卡标记消除卡表伪共享,计数循环让 System.gc 等待 2.7 秒,Survivor 过小使晋升量增加约 400 倍。文末梳理 JDK 8 到 27 的收集器演进、选型路径与排查顺序。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 17万+

CMS GC优化实战:降低请求高峰期GC Remark阶段停顿时间

本文通过分析CMS GC的Remark阶段在高并发环境中的影响,探讨了如何通过优化CMS GC配置来减少停顿时间。具体包括启用并发预清理机制、强制执行Minor GC等策略,优化后系统的GC停顿时间和吞吐量得到了明显改善,尤其在高峰期,系统的响应能力得到了显著提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 14万+

14.GC如何判断对象可以被回收

根可达性很好的解决了对象循环引用问题。

weixin_43613968的博客 302

六百毫秒一次的清场:MinorGC频率的延迟代价、动态晋升年龄与新生代调参实战解析

Minor GC每600ms一次、每次25ms,停顿占比只有4.17%,被碰到的请求却达12.5%。本文先用离散事件仿真算清三层账:停顿占比、受影响请求与TP99、TP99.9增量,说明总停顿不变时少而长的停顿更伤尾部;再对照HotSpot源码讲透动态年龄判定,教你从年龄表分辨阈值被压低、Survivor溢出与中寿命对象;随后在JDK 8 ParNew+CMS上实测十组配置,证明只调年龄上限无效、适度加大新生代可让过早晋升近乎归零;最后给出六步定容法、灰度验收清单与G1、ZGC下的适用边界。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

如何判断对象可以被回收?

判断对象是否可以被回收是垃圾回收器的任务。现代 JVM 使用可达性分析(Reachability Analysis)算法,通过 GC Root 作为起点,遍历引用链来判断对象是否可达。如果对象不可达,则认为它可以被回收。理解垃圾回收机制和对象的生命周期,有助于编写高效的 Java 程序,并有效管理内存。在 Java 中,垃圾回收(Garbage Collection, GC)机制负责自动管理内存,回收不再使用的对象。判断对象是否可以被回收是垃圾回收器的任务。

喜欢猪猪 1128

单次 CMS Old GC 耗时长问题分析与优化

本文探讨了 Java 应用中 CMS Old GC 停顿时间过长的问题,分析了可能导致长时间 GC 停顿的原因,如 Full GC、Promotion Failure、内存碎片化等,并提出了相应的优化方案。通过调整 JVM 参数(如增加 Old Generation 内存、减少 Promotion Failure、开启内存压缩等)和提高 GC 并行度,可以有效减少 GC 停顿时间,提高系统性能。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 14万+

当并发清扫来不及:CMS退化为串行Full GC的触发路径、日志判读与治理解析

CMS在JDK8中以并发清扫换取短停顿,但当并发周期跑输晋升、老年代碎片放不下大对象、晋升担保失败或System.gc()打断周期时,HotSpot会改用单线程的标记-整理接管整个堆,停顿从毫秒升到秒级。本文结合HotSpot源码与12组可复现实验,拆解四条退化路径与各自的日志指纹,说明如何从GC日志读出晋升速率、周期时长、最大连续块和user/real比值,给出触发线的计算方法与治本优先的治理清单,纠正几条流传甚广的错误建议,并对比迁移到G1后的实测效果,明确结论的适用范围与不适用的场景。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

【gc 如何判断对象可以被回收】

可达性算法中的不可达对象并不是立即死亡的,而是对象拥有一次自我拯救的机会,对象被系统宣告死亡至少要经历两次标记过程:第一次是经历可达性分析发现没有与GC roots相连接的引用,第二次是在由虚拟机自动建立的Finalizer队列中判断是否需要执行finalize方法。当一个对到GC roots 没有任何引用链,则证明对象是不可用的,那么虚拟机就会判断是可回收对象。每个对象有一个引用计数属性,新增一个引用时计数器+1,引用释放时计数器-1,计数为零时可以被回收。有循环引用的问题,Java没有使用这种方法。

weixin_43164559的博客 380

SpringSecurity(15)——OAuth2密码模式

SpringSecurity Oauth2密码模式

peng_gx的博客 1520

JVM垃圾回收—各类gc回收器关于full gc的区别

因为最近在项目中排查内存溢出的问题,所以特意回顾整理了一下GC的相关知识,发现网上的文章对于GC的触发条件与区别都各有不同,容易混淆。特此mark一下。 这里回顾一下jvm的分代回收。JVM将堆空间(heap)划分为eden区,s0(survivor0),s1(survivor1),old区,metaspace(永久代jdk1.8),其中eden,s0,s1统称young gen(年轻代) ...

u011230736的专栏 1599

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

【图形学】后处理下的HDR、颜色分级、颜色映射与颜色空间

目录 一、Color Grading 1.1概念 1.2 内置在Unity/UE4 二、HDR、LDR与VDR 2.1 LDR 2.2 HDR 2.3 VDR 三、Tone Mapping 3.1 概念 3.2 算法发展史 3.3 ACES算法 四、常见的颜色空间标准 参考 一、Color Grading 1.1概念 Color Grading(颜色分级、颜色校正)俗称调色,是游戏后期处理中最常见也是必要的一个环节。它能够改变或矫正最终图像的颜色和亮度,你可以把它想象...

ColorGalaxy 8417

JVM 性能调优 -- CMS 垃圾回收器 GC 日志分析【Full GC】

上一篇我们分析了 Minor GC 的发生过程,因为 GC 日志没有按我们预估的思路进行打印,其中打印了 CMS 垃圾回收器的部分日志,本篇我们就来分析一下 CMS 垃圾收集日志。

weixin_42118323的博客 1416

链接文件及功能安全:Hightec如何将Flash驱动放进RAM

Fls本身是无法操作自身的,犯冲突。Fls_WriteCmdCycles (预留300字节)与 Fls_EraseCmdCycles(预留200字节) 函数在执行之前将会Copy进RAM,Fls本身是不能操作Fls本身的,除非把最底层的驱动函数防止在RAM或者其他的Flash里面,假设Flash放置在PF0可以操作PF1。英飞凌的驱动有个规定写指令预留300字节,擦除指令预留200字节。

梦想技术家 2141

【Java】 GC 快速回顾

Java GC 如何判断对象是否死亡? 有2⃣️种方法: 引用计数 可达性分析 标记对象真正死亡的过程? 有3⃣️个步骤 通过可达性分析,标记并筛选对象(是否有必要执行finalize()) 将筛选过后的对象加入F-Queue JVM开启finalizer线程处理F-Queue GC Roots大概有哪些? 局部变量、静态变量、常量的引用 Class类型对象 JNI对象(Native方法引用的对象) 被synchronized关键字持有的对象 方法区怎么回收? 方法区要回收的主要是:不用的cla

zlt_blog 226

故障排查:OpenClaw 更新后 feishu 插件路径失效的解决方法

OpenClaw 更新后 feishu 插件路径失效的解决方法发现问题→ Gateway 启动失败,报插件路径错误定位原因→ OpenClaw 目录结构变化,→解决问题→ 更新为正确的路径验证修复→ 使用确认一切正常。

刘一说的IT专栏 1304

STM32F401RCT6最小系统原理图设计

STM32F401RCT6最小系统原理图设计一、主控芯片二、电源电路三、晶振电路三、下载电路四、完整电路图      本文章基于STM32F401RCT6进行最小系统原理图设计,包含主控芯片,电源,晶振电路,下载电路等几部分 一、主控芯片 主控芯片采用STM32F401RCT6,需注意: VBAT在不接电池的情况下需接3.3V,VDDAVREF+需接3.3V,否则会造成芯片供电不正常,无法启动和识别的情况 VDDAVREF+和VCAP1处电容需按照规格书

weixin_43278295的博客 2万+

Golang GC 介绍

GC 全称 Garbage Collection,目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法(Tracing garbage collection)和引用计数法( Reference counting )。Golang 使用的三色标记法属于追踪式垃圾回收算法的一种。追踪式算法的核心思想是判断一个对象是否可达,因为一旦这个对象不可达就可以立刻被 GC 回收了。

Doublelv 的博客专栏。 2310

Vision 机器视觉案例 之 零件边缘缺陷检测

缺陷检测工具

机器视觉李小白的博客 1385

如何写出高性能代码(三)优化内存回收(GC)

同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员 不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。......

xindoo 8298

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【JVM】—G1中的Young GC、Mixed GC、Full GC详解

G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。 Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。 Mixed GC:选定所有年轻代里的Region,外加根据Global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。

一棵灬大树的博客 3638

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: ‘javap’不是内部命令或外部命令,也不是可与逆行的程序或批处理文件
下一篇: 初识外包企业的职能
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值