深入理解Java虚拟机(学习笔记) - Day2 -如何知道对象是否死亡

如何判断对象是否已经死亡

  1. 引用计数法
    • 给对象添加一个引用计数器,每当对象在一个地方被引用时,这个计数器的值就+1,当引用失效时,这个计数器的值就-1,当计数器的值为0时,表示这个对象在任何地方都没有被引用,即该对象已经死亡。
    • 由于很难解决对象之间的循环引用问题,所以该方法没有被应用在JVM中
  2. 可达性分析
    • 通过一系列称为**“GC Roots”的对象作为起始点,从这些对象开始向下搜索,其走过的路径被称为“引用链(Reference Chain)”**,当一个对象到"GC Roots"之间没有任何引用链时,表示这个对象是不可用的,是可以被GC 回收的
    • GC Roots 包括:
      1. 虚拟机栈中引用的对象
      2. 方法区中类静态属性引用的对象
      3. 方法区中常量引用的对象
      4. 本地方法栈中的JNI引用的对象
  3. 引用的类型
    1. 强引用,没有对应的类,例如:

      • Object obj = new Object();

      • 这种引用就是强引用,只要强引用存在,这个对象永远不会被回收

    2. 软引用,对应的类为 SoftReference,只要不发生OOM,那么拥有软引用的对象就不会被回收

    3. 弱引用,对应的类为 WeakReference,只要发生了GC,那么只拥有弱引用的对象就会被回收

    4. 虚引用,又称幻象引用,对应的类为 PhantomReference,当拥有虚引用的对象被回收时会收到一个系统通知

  4. 当对象已经为不可达状态
    • 此时对象不一定马上死亡,还有一次自救的机会,即重新建立新的引用链
    • 在执行finalize() 方法时,如果重新建立了引用链,那么这个对象就不会被回收
    • 对象的 finalize() 方法只能被调用一次
  5. 方法区的垃圾回收
    • 主要回收内容为:废弃常量和无用的类
    • 废弃常量:一个常量没有被任何一个对象所引用
    • 无用的类(同时满足以下条件):
      • 该类的所有实例都已经被回收
      • 加载该类的ClassLoader已经被回收
      • 该类对应的Java.lang.Class对象没有在任何地方被引用
    • 并不是必定回收,只是达到了回收的标准
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值