jvm中是如何判断对象是否存活的

JVM如何判断一个对象是否存活? 前言 在 深入浅出Java虚拟机(三)——初识JVM的垃圾回收机制 中我们介绍了如何判断对象已死的两种算法,分别是引用计数法和可达性分析法。 本文我们再来详细说明一下JVM中判断对象是否、存活的相关细节。 finalize()方法的执行条件 即使在可达性分析算法中判定为不可达的对象, 也不是“非死不可”的, 这时候它们暂时还处于“缓刑”阶段, 要真正宣告一个对象死亡, 至少要经历两次标记过程: 第一次标记: 如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链, 那它将会被第一次标记, 随后进 阅读详情

在JVM中判断对象是否存活的过程中,涉及多种机制和概念。下面将对每个重要点进行详细说明,包括项目中的应用场景、使用方式和背后的原理。

1. 引用计数法(Reference Counting)

1.1 项目应用场景:

引用计数法并没有被JVM广泛使用,但在某些编程语言和框架中是常见的资源管理方法。它适合于不复杂的对象引用环境,例如:

  • 资源管理场景:在一些简单的项目中(如嵌入式系统、文件句柄管理),可以使用引用计数法来管理对象生命周期。C语言中用于管理COM对象,Python 3之前的垃圾回收部分采用了引用计数机制。
  • 对象池和缓存管理:对于简单的缓存系统,可能通过引用计数法来管理对象,确保在不再使用时自动释放资源。
1.2 实现方式:

每个对象维护一个计数器,用来跟踪该对象被多少其他对象引用。当一个新对象持有对该对象的引用时,计数器增加;当引用消失(例如引用被重新赋值或对象销毁)时,计数器减少。如果对象的计数器为0,则该对象可以被认为是无用的并进行垃圾回收。

1.3 优缺点分析:
  • 优点:实现简单,容易理解。对象可以在引用计数为0时立即回收,不需要复杂的标记和遍历。
  • 缺点:无法处理循环引用问题。例如,两个对象相互引用,但外部没有其他引用指向它们时,它们的引用计数都不会降为0,导致无法回收。

2. 可达性分析算法(Reachability Analysis)

2.1 项目应用场景:

可达性分析算法是现代JVM中用于判断对象是否存活的主要机制,适合大部分Java应用程序。常见的应用场景包括:

  • 大型Web应用和企业系统:例如使用Spring、Hibernate等框架的系统,其中涉及大量复杂的对象引用关系和依赖。
  • 分布式系统:在复杂分布式架构中,服务之间的引用关系也需要考虑,例如在微服务中管理对象的生命周期。
  • 服务端应用:高并发和高吞吐量的服务器端应用中(如金融系统、交易平台等),可达性分析帮助系统有效管理内存资源。
2.2 实现方式:

可达性分析算法从GC Roots集合出发,遍历整个对象图。GC Roots是可以作为根节点的特殊对象集合,典型的GC Roots包括:

  • 栈中的局部变量:例如当前运行线程栈中的局部变量和方法参数,它们是GC Roots的一部分。
  • 静态变量:类静态字段存储在方法区中,它们引用的对象是GC Roots的一部分。
  • JNI引用:由Native代码(如JNI接口)持有的引用也是GC Roots。

可达性分析通过从这些GC Roots开始进行深度优先搜索,遍历每个对象的引用链。凡是可以从GC Roots到达的对象被标记为存活,无法到达的对象则视为不可达,最终会被回收。

2.3 优缺点分析:
  • 优点:有效解决循环引用问题,通过引用图的遍历,无论对象之间是否存在循环引用,只要它们不可达,就会被回收。
  • 缺点:需要一定的开销进行GC Roots集合的遍历,尤其是在大量对象的情况下,遍历会花费一定的时间。

3. 三色标记法(Tricolor Marking)

3.1 项目应用场景:

三色标记法通常用于解决并发标记问题,适合响应时间敏感的项目,例如:

  • 实时数据处理系统:如电商推荐引擎,要求系统在执行GC时不会造成较长时间的停顿。
  • 金融交易系统:对于要求快速响应的金融应用,减少垃圾回收的“Stop-the-World”停顿时间尤为关键。
3.2 实现方式:

三色标记法是一种高效的对象可达性标记算法,在GC过程中把对象分为三种颜色:

  • 白色:尚未被GC访问的对象。标记完成后仍为白色的对象将被认为是不可达的,需要回收。
  • 灰色:对象本身被标记,但它的引用还未完全扫描。GC会继续扫描灰色对象的引用。
  • 黑色:表示对象及其引用链已经完全遍历,它们被视为存活对象。

该算法通过将对象分为三种状态,并通过不断的遍历和扫描引用链来确保对象状态的正确性,从而控制垃圾回收的执行进度,减少对应用程序的中断。

3.3 优缺点分析:
  • 优点:在并发垃圾回收器中使用,避免了传统的“Stop-the-World”大幅度暂停时间,适合对性能有较高要求的场景。
  • 缺点:算法相对复杂,实现难度高,尤其是在并发回收的场景下,需要确保不会出现未标记的存活对象被错误回收的情况。

4. 引用类型的区分(Reference Types)

4.1 项目应用场景:

JVM通过不同类型的引用,管理对象生命周期和回收策略。常见的应用场景包括:

  • 强引用:用于普通的业务逻辑,代码中常见的对象引用,例如User user = new User();。
  • 软引用:适用于实现缓存机制的项目。例如缓存数据,当内存不足时,系统可以回收软引用对象以释放内存。SoftReference类可用于实现这类缓存。
  • 弱引用:适合实现类似WeakHashMap的结构,常用于大型对象图的内存敏感部分,在垃圾回收时可以尽快释放不再使用的对象。比如大规模的图片缓存,减少内存占用。
  • 虚引用:用于监控对象何时被垃圾回收,例如用于资源清理机制。在NIO的DirectByteBuffer内存管理中,虚引用用于监控和回收非堆内存。
4.2 实现方式:

JVM提供了四种不同级别的引用:

  • 强引用(Strong Reference):最常见的引用类型,强引用的对象只要被引用,就不会被GC回收,除非显式断开引用。
  • 软引用(Soft Reference):用java.lang.ref.SoftReference表示,当系统内存不足时,软引用关联的对象会被回收,但如果内存足够,它们会保留。
  • 弱引用(Weak Reference):用java.lang.ref.WeakReference表示,弱引用对象在下一次GC时就会被回收,无论内存是否充足。
  • 虚引用(Phantom Reference):用java.lang.ref.PhantomReference表示,虚引用不会影响对象的回收,它主要用于监控对象被GC回收的时间点。
4.3 优缺点分析:
  • 强引用:不会被GC回收,但容易造成内存泄漏,适合长期存活对象。
  • 软引用:适合做缓存管理,但需要考虑内存不足时缓存对象被回收的风险。
  • 弱引用:适合内存敏感的应用场景,可以在GC时迅速释放对象。
  • 虚引用:主要用于资源清理与管理,不影响对象的存活时间。

5. 引用队列(Reference Queue)

5.1 项目应用场景:

引用队列适用于需要处理对象被GC回收后的一些清理操作的场景。常见的应用场景包括:

  • 内存敏感型缓存:通过监控弱引用或软引用对象,回收后自动移除缓存中的条目。
  • 资源清理:可以监控对象的GC回收事件,及时释放底层资源,如关闭文件句柄、网络连接等。
5.2 实现方式:

当一个软引用、弱引用或虚引用所指向的对象被回收后,JVM会将这些引用加入到一个ReferenceQueue中。开发者可以通过轮询或监听该队列来获取已经被GC回收的对象,并执行相应的清理操作。

5.3 优缺点分析:
  • 优点:允许开发者在对象回收后处理资源清理等后续任务,能够优化资源管理。
  • 缺点:需要额外的代码来管理引用队列,并可能增加系统的复杂度。

6. GC Roots的类型及其应用

6.1 项目应用场景:

GC Roots是可达性分析的起点,决定了哪些对象可以被认为是存活的。理解GC Roots的类型和范围有助于优化垃圾回收策略,特别是在需要精确管理内存的高性能应用中,例如:

  • 高性能交易系统:实时交易系统中,需保证关键对象不会被误回收,这些对象可以作为GC Roots。
  • 框架底层优化:像Spring、Tomcat等框架通过管理GC Roots,保证核心对象的长生命周期,而不是被频繁回收。
6.2 GC Roots的典型类型:
  1. 栈中的局部变量:运行时栈中方法的局部变量是最常见的GC Roots来源。例如:
    • 在Java方法执行过程中,局部变量表中的对象引用不会被回收。
  2. 静态字段引用:类的静态变量(被static修饰的字段)存储在方法区,引用的对象也会被视为GC Roots。例如:
    • 静态常量或服务实例通常会长时间存在,作为GC Roots参与可达性分析。
  3. JNI引用:本地方法栈中的JNI代码持有的引用也属于GC Roots。例如:
    • Native方法调用中涉及的对象引用,必须确保在JVM中不会被回收。
  4. 常量池中的引用:字符串常量池或类的常量池中的对象引用,也可能被当作GC Roots。例如:
    • 像String类的字符串字面量,会被存储在常量池中,避免被GC回收。
  5. 活动线程:JVM中正在运行的线程自身及其栈上的引用,也会作为GC Roots。例如:
    • 多线程应用中,线程对象在任务执行期间不会被回收。
6.3 优缺点分析:
  • 优点:通过这些GC Roots类型,JVM能够有效识别存活的对象,确保关键对象不会被误回收。
  • 缺点:GC Roots的数量和遍历深度会影响GC的效率,尤其在大量静态变量或本地引用存在的情况下,GC扫描时间可能会增加。

7. 代际假说(Generational Hypothesis)

7.1 项目应用场景:

代际假说是垃圾回收策略的重要理论基础,主要应用于以下场景:

  • 大规模Web应用:Web应用中对象生命周期差异大,短生命周期对象(如请求参数、缓存)和长生命周期对象(如数据库连接池)可以通过代际回收有效管理。
  • 企业级系统:企业系统中通常会有大量的短期任务或临时数据,代际假说帮助优化内存回收,提升系统性能。
7.2 实现方式:

代际假说认为,大多数对象的生命周期很短,而存活较长的对象往往会存活更久。因此,JVM将堆内存划分为不同的“代”(Generation),并采用不同的回收策略:

  1. 年轻代(Young Generation):包含新分配的对象,大多数对象会很快被GC回收。
    • Eden区:新创建的对象首先分配到Eden区。
    • Survivor区:经过一次GC未被回收的对象会移到Survivor区。
  2. 老年代(Old Generation):经过多次GC仍然存活的对象会被移动到老年代,这里的对象一般是长期存活的。
  3. 永久代(Metaspace):存储类的元数据、方法区信息(在Java 8之前称为永久代,之后改为Metaspace)。

GC主要分为两类:

  • Minor GC:只对年轻代进行垃圾回收。
  • Major GC(Full GC):对整个堆内存(包括年轻代和老年代)进行回收。
7.3 优缺点分析:
  • 优点:代际回收策略能够提高垃圾回收效率,避免不必要的全堆扫描,特别适合短生命周期对象多的应用。
  • 缺点:当老年代空间不足或产生过多的Full GC时,系统可能出现较长时间的暂停。

8. SafePoint 和 Safepoint Polling

8.1 项目应用场景:

在响应时间敏感的应用中,SafePoint的设计非常重要。它能够确保在执行GC时,不会因为线程的非协调行为导致系统崩溃。适用于以下场景:

  • 高并发应用:在高并发的服务中(如银行交易系统),需要快速同步各个线程来进行垃圾回收,避免产生竞争条件或数据不一致。
  • 虚拟机层调优:JVM调优时SafePoint是一个重要考虑因素,过多的SafePoint可能导致性能下降。
8.2 实现方式:

SafePoint是JVM执行垃圾回收时,所有线程必须进入的一个安全点。在SafePoint时,所有的Java线程都会暂停,以确保系统在回收期间没有线程执行可能修改对象引用的操作。进入SafePoint有两种方式:

  1. 主动进入:在方法调用、循环边界、异常处理等容易暂停的地方主动检查是否需要进入SafePoint。
  2. 被动等待:JVM会在SafePoint轮询(Polling)中主动检查GC请求,确保系统在进行垃圾回收时线程能迅速同步。
8.3 优缺点分析:
  • 优点:通过SafePoint机制,JVM能够确保所有线程在GC期间处于一致状态,避免在回收过程中对象引用的变化。
  • 缺点:过多的SafePoint检查可能引发性能问题,特别是在计算密集型应用中。

9. Stop-the-World(STW)

9.1 项目应用场景:

Stop-the-World(STW)机制在垃圾回收期间,JVM会暂停所有应用线程进行内存回收。应用场景包括:

  • 内存占用较高的应用:当应用内存使用达到上限时,可能会触发STW以执行GC。
  • 大型内存清理任务:在一些场景中,为了保证内存使用的清理彻底,可能必须执行STW。
9.2 实现方式:

当JVM执行垃圾回收时,通常会暂停所有正在运行的应用线程,直到垃圾回收过程完成为止。这个暂停时间是"Stop-the-World"事件。为了减少STW的影响,现代GC算法通常会在短时间内完成垃圾回收,或者通过并发GC来减轻STW时间。

9.3 优缺点分析:
  • 优点:在执行GC期间保证内存的完整性,确保所有内存操作在一致的环境下进行。
  • 缺点:STW会导致应用程序的暂停时间,特别是大规模内存应用中,这种暂停可能会明显影响系统的响应时间和用户体验。

总结

JVM中判断对象是否存活的机制通过多种方法共同作用。引用计数法虽然简单,但在处理复杂引用时存在局限性。可达性分析算法作为JVM主要的垃圾回收机制,通过GC Roots的追踪有效解决了循环引用问题。三色标记法和SafePoint等机制则进一步优化了并发GC的效率,减少了GC对系统性能的影响。而代际假说则基于对象生命周期的不同特点,优化了GC的执行流程。

这些机制和技术点在大型应用项目中,特别是在高并发、实时响应等要求较高的场景中,都有着非常重要的应用。通过合理的GC策略和调优,开发者可以显著提升Java应用程序的性能和稳定性。

jvm如何判断对象是否存活 对象存活算法引用计数法 对象存活算法引用计数法 首先说定义:就是一个对象被引用的话,计数器就+1,当引用失效时就-1,当是0就表示对象可以回收。 优点:实现简单高效 缺点:无法解决循环引用的问题 可以看一个案例来证明: public class test { private Object instence; public test() { //开辟一片20MB大小的内存,便于形象的看出释放效果 byte [] b = new byte[20 * 1024 * 阅读详情

相关推荐

Halcon VariableInspect (变量检查拓展)安装指南

网址2;

T 956

JVM:判断对象是否存活

JVM如何判断对象是否存活

Java开发相关的学习笔记 1217

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1588

JVM中判断对象的存活

判断对象是否存活的方法 引用计数法 可达性分析 一、引用计数法 在对象中添加一个引用计数器,每当有一个地方引用该对象,计数器就+1,当引用失效时,计数器-1 存在的问题 两个对象相互引用的时候可能无法被回收 二、可达性分析(JVM中使用的方法) 通过一系列被称为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,说明此对象是不可用的 JVM中作为GC Roots的对象 虚拟机栈(栈帧中的局部变量表)中

weixin_42779514的博客 300

ECC椭圆曲线加解密原理详解(配图)

椭圆曲线加解密原理详解 本文主要参照:ECC椭圆曲线详解(有具体实例)[1] 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂。拜读了大神Kalafinaian文章“ECC椭圆曲线详解(有具体实例)”,终于看到了参透的曙光。 由于原文中有微小的瑕疵,也为了便于阅读起来更加流畅,我重新整理了一下这篇文章。 为什么使用椭圆曲线加密算法? RSA的解决分解整数问题需要亚指数...

Mark的博客 7万+

告别卡顿!OBS Studio最佳录制参数设置指南(适合游戏/网课/会议场景)

本文提供OBS Studio录制参数优化指南,针对游戏、网课及会议三大场景,详细解析帧率、码率与编码器设置。重点推荐利用硬件编码器(如NVENC)实现游戏录制零卡顿,并分享清晰稳定的网课录制与长时间会议录制配置方案,助你告别视频卡顿与音画不同步问题。

e4f5g6h7的博客 1330

JVM---对象是否存活及被引用的状态

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可 达,判定对象是否存活都和“引用离不开关系。在JDK 1.2版之前,Java里面的引用是很传统的定义: 如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference数据是代表 某块内存、某个对象的引用。这种定义并没有什么不对,只是现在看来有些过于狭隘了,一个对象在 这种定义下只有“被引用或者未被引用两种状态,对于描述一些食之无味,弃之可惜。

你我约定有三的博客 1426

2025.03.14【读书笔记】|GWAS分析神器:BOLT-LMM工具介绍与快速安装

在生物信息学领域,全基因组关联分析(GWAS)已成为揭示遗传与疾病关系的强有力工具。BOLT-LMM作为一款专为大规模样本量设计的GWAS分析工具,将极大地提高研究人员的工作效率。大家好,今天我们来聊聊一个非常强大的生物信息学工具——BOLT-LMM。它是基于线性混合模型(LMM)的全基因组关联分析(GWAS)分析工具,通过快速的方差近似方法在计算效率上实现了显著的提升。BOLT-LMM的高效性能使其成为大规模样本GWAS分析的理想选择,它将进一步推动生物信息学和遗传学研究的发展。

1093

JVM判断对象是否存活

堆中几乎存放着所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”,那些对象已经“死去”(即不可能被任何途径使用的对象) 一、引用计数算法(Reference Counting) 给对象中添加一个引用计数器,每当又一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对象就是不可能在被使用的.但是Java语言中没有选用引用计数法来管理内...

weixin_34375233的博客 292

攻克+86手机号Discord验证墙:从“无效”到“成功”的实战指南

本文提供了一份针对+86手机号在Discord注册时频繁遭遇“手机号无效”问题的实战解决指南。文章系统分析了问题根源,并分步详解了从打造纯净网络环境、尝试多种手机号格式(如+86前加0),到更换iOS等客户端设备的有效方法,旨在帮助用户成功完成Discord手机号验证。

mac99的博客 1098

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 167

JVM判定对象是否存活

文章目录确定对象是否存活算法1、引用技术算法2、可达性分析算法JDK引用 确定对象是否存活算法 1、引用技术算法 给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就+1;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能再被使用的。 优点:实现简单,判定效率高 缺点:很难解决对象相互循环引用问题 public class ReferenceCountingGc{ p...

白杨 485

Transformer实战(33)——高效自注意力机制

在本节中,我们学习了如何在硬件资源受限的情况下减轻运行大模型的负担,介绍了高效的稀疏 Transformer 模型,通过近似技术(如 Linformer、BigBird 和 Performer) 用稀疏矩阵替代全自注意力矩阵。并观察它们在各种基准测试中的表现,例如计算复杂度和内存复杂度。结果表明,这些方法可以在不牺牲性能的情况下将平方级复杂度降低到线性复杂度。

盼小辉丶的博客 3018

JVM 是如何判断对象是否存活?

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1006

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM 如何判断对象是否存活

JVM 判断对象是否存活 在进行GC之前,首先要确定的就是在java堆中那些对象已经“死去”那些对象还“活着” 引用记数法(Referencecounting) 了解即可,虚拟机并不是通过该算法来判断对象是否存活。 引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被...

撸代码的小菜鸟 431

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JVM中如何判断对象是否存活?

本文探讨了JVM中判断对象存活的关键技术:1)引用计数机制通过增减计数器判断对象状态;2)可达性分析工具检测对象引用关系;3)结合GC策略(如新生代GC、标记清除GC)进行内存管理。文中还介绍了监控引用变化、使用分析工具等实践方法,强调根据应用场景选择合适策略对保障程序稳定性的重要性。这些技术共同构成了JVM对象生命周期管理的核心机制。

2501_90410679的博客 129

JVM如何判断对象是否存活

给对象中添加一个引用计数器,当有地方引用它的时候计数器就+1,当引用失效,计数器就-1,当计数器为0的时候,对象就是不可能再被使用的。从GCRoots开始向下搜索,没有被搜索到的对象就是不可用的。三色标记法把对象分为三种状态:白色、灰色、黑色。白色:该对象没有被标记过。灰色:该对象已经被标记过了,但是该对象的引用对象还没有标记完。黑色:该对象已经被标记过了,而且该对象的引用对象全部被标记完了。

m0_61505483的博客 248

JVM在垃圾回收时如何判断对象是否存活

JVM有两种算法来判断对象是否存活,分别是和。

M_10240的博客 967

JVM如何判断对象是否存活?,GC roots可以是哪些?

JVM如何判断对象是否存活及GC Roots详解,当JVM判断对象不再存活的时候,便会在下一次GC时候将该对象回收掉 JVM有三种算法来判断对象是否存活,分别是引用计数法和可达性分析算法,和可达性分析法,JVM主要通过三色标记算法(Reachability Analysis)来判断对象是否存活,这是现代JVM主流的垃圾判定方法。

gwndjsh的博客 1128

JVM怎么判断对象是否存活

JVM怎么判断对象是否存活 引用计数算法 引用计数算法比较简单,对每个对象保存一个整型的引用计算器属性。用于记录对象背应用的情况。 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减少1.只要对象A的引用计数器的值为0,便表示对象A不可能再被使用,可进行回收。 优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟。 缺点: 它需要...

qq_29860591的博客 488

JVM如何判断Java对象是否存活,是否要被GC回收?

GC在对堆内存进行垃圾清理之前,需要判断哪些Java对象不再被使用,需要被回收。通常有两种算法:引用计数算法、可达性分析算法。 引用计数算法(已被淘汰) 引用计数算法:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 存在的问题:主流的Java虚拟机里面都没有选用引用计数算法来管理内存,因为单纯的引用计...

西瓜游侠的博客 1505

JVM如何判断一个Java对象是否存活

1.为什么要判断一个Java对象是否存活 判断一个Java对象是否存活对于垃圾回收、防止内存泄漏等十分重要 垃圾收集器对Java堆里的对象 ,判断对象为死亡才会进行回收 在Java虚拟机中,判断对象是否存活有2种方法: 引用计数法 引用链法(可达性分析法) 2. 引用计数法 2.1 方式描述 给Java对象添加一个引用计数器 每当有一个地方引用它时,计数器 +1;引用失效则...

zhangvalue的博客 1589

【JVM笔记】GC:判断对象是否存活

概述:判断对象是否存活(或是否死去):可达性分析算法概念介绍:引用、两次标记垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还存活着,哪些已经死去。【引用计数算法】在对象中添加一个引用计数器,每当有一个地方引用时,计数器值加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不能再使用的。JVM没...

weixin_37071492的博客 87
上一篇: JVM中垃圾回收
下一篇: Redis的部署架构详解
yymagicer
博客等级 码龄13年 1425粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yymagicer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值