JVM学习笔记-垃圾回收之检测垃圾的方法

  1. 引用计数算法
    • 原理:对象A被其他对象引用时,引用计数+1,当其他对象被垃圾回收时,对象A的引用计数-1,当对象A的引用计数=0时,对象A可被垃圾回收。
    • 优点:实现简单,判定效率高
    • 缺点:需要额外的空间去存储计数器,关联更新计数时增加了时间开销,无法解决循环依赖
    • 补充:Cpython(C语言开发的Python解释器)使用双向链表解决循环依赖问题,但是需要额外字段去存储标识数据(gc_refs),费空间、费性能
  2. 可达性算法
    • 什么样的对象可作为GCRoot: 如果一个指针,他保存了堆内存里的对象地址,但是自己又不放在堆内存里,那他就是一个Root。
      • 虚拟机栈中的引用对象:方法中使用的参数、局部变量等
      • 方法去中类静态属性引用的对象
      • 方法区中常量引用对象:字符串常量池里的引用
      • 所有被同步锁synchronized持有的对象
      • java虚拟机内部的引用:基本数据类型对应的class对象,一些异常对象(如空指针,内存溢出),系统类加载器
    • 原理:通过判断对象与GCRoot引用链是否可达,当不可达时,此对象可被回收
    • 重点:由于finalize()的存在,虚拟机中的对象可能会有3中不同的状态
      • 可触及的:从根节点开始,引用链可达
      • 可复活的:对象的所有引用都被释放,但是还没有执行过finalize(),此时会将对象放入F-Queued队列,如果执行时与引用链上的对象建立联系,则此对象可复活
      • 不可触及的:执行过finalize(),且没有复活,则对象被标记为可回收(finalize只能被执行一次,也就是说当对象被复活后再次不可达时,会直接被标记为可回收)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值