JVM中判断对象是否存活算法

10 篇文章 0 订阅
垃圾回收算法是编程中用于管理内存的重要机制。本文介绍了两种主要的算法:引用计数和可达性分析。引用计数简单但无法处理循环引用,而可达性分析能准确判断对象生死,包括两次标记过程和 finalize() 方法的执行。此外,还详细阐述了 Java 中的四种引用类型:强引用、软引用、弱引用和虚引用,它们在内存管理中扮演不同角色。
摘要由CSDN通过智能技术生成

垃圾回收先判生死

垃圾回收算法:

  • 引用计数算法

    • 在对象中加一个引用计数器,当有地方引用他时,计数器值+1,引用失效时,计算器值减1。计数器为0的对象是不能再被引用的。

    • 引用计数很难解决对象之间相互循环引用的问题。

    • 使用例子:微软com技术,python

    • 如果两个对象相互访问,则引用计数器无法回收他们

  • 可达性分析算法

    • 通过一些GC Roots的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,如果对象到GC Roots间没有路径,则从GC Roots到这个对象是不可达的,这些对象要被回收。
    • 宣告对象真正死亡,至少两次标记:若对象在进行可达性分析后发现没有与GC Roots相连,那它将会被第一次标记,随后进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。假如对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用 过,那么虚拟机将这两种情况都视为“没有必要执行”。若被判有必要执行,则对象被放置在F-Queue的 队列中,稍后会有线程去执行finalize()方法,finalize()方法是最后拯救的机会。

    Java引用分类

  • 强引用:指程序中的引用赋值,即类似“Object obj=new Object()”这种引用关系,只要强引用关系在,垃圾收集器就永远不会回收被引用的对象。

  • 软引用:只被软引用关联着的对象,在系统要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。

  • 弱引用:也是用来描述那些非必须对象,强度比软引用更弱,被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。

  • 虚引用:并不影响其生存空间,为一个对象设置虚引用的唯一目的只为了能在这个对象被收集器回收时收到一个系统通知。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值