判断对象是否存活

本文深入探讨了两种主要的垃圾回收算法:引用计数算法和可达性分析算法。详细解析了Python如何利用引用计数算法进行内存管理,以及其在循环引用场景下的局限性。同时,阐述了Java等语言采用的可达性分析算法,通过GC Roots跟踪对象引用,实现对不再使用的对象的准确识别。文章还介绍了不同类型的引用和finalize方法的作用与限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.引用计数算法

给对象添加一个引用计数器,当有一个地方引用它时,计数器就加一;当引用失效时,就减一;任何时刻计数器为0的对象都是不可能再被使用的。

缺点:不能解决相互循环引用的问题。 当两个对象相互引用时,无法回收。

Python使用的是引用计数算法。Java不是。

2.可达性分析算法

Java、C#、Lisp所使用的

通过一系列的GC Roots的对象作为起点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即从GC Roots到这个对象不可达)时,证明此对象不可用。

可以作为GC Roots的对象:

  1. 虚拟机栈中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI引用的对象

强引用、软引用、弱引用、虚引用


finalize方法:

  1. 只会执行一次
  2. 如果没有finalize方法或已经执行过finalize方法,JVM会将此种情况视为没必要执行finalize方法
  3. 如果有必要执行,会将此对象放在JVM建立的、低优先级Finalizer线程去执行finalize方法。
  4. 所谓的执行指触发这个方法,但并不承诺会等待它运行完毕。(考虑到死循环或执行缓慢的极端情况,如果不这样可能会永久等待)
  5. finalize方法中,如果将自己与引用链某一个对象关联上,那么这个对象会逃过一劫。但这个对象再次回收时,不会执行finalize方法,直接释放对象。

注:
1、不要在finalize方法中将对象与引用链的对象关联上
2、不要在finalize方法中释放资源,尽量使用try-finally块

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值