垃圾收集主要针对Java对和方法区中内存动态变化的过程
那么如何判断Java世界中的对象实例是否死亡呢?
下面将介绍在Java虚拟机中判断对象死亡的方法

对象已死?

引用计数法

顾名思义,引用计数法即通过一个引用计数器,每当这个对象被一个地方引用时计数器值就加一,当引用失效时计数器值减一

那么任何时刻,计数器为零的对象就是不能被再使用的对象,即已死对象

但是此方法有一个缺点是可能出现对象之间循环引用的情况,那么计数器将永不为零,即对象永远无法被垃圾器收集到

可达性分析法

可达性分析法是通过可达性分析算法来判定对象是否存活,通过GC Roots作为根对象,当对象与GC Roots没有引用链相连时(即从GC Roots到这个对象是不可达),即判定该对象死亡

垃圾收集器判断对象是否存活
一般作为GC Roots的对象有以下几种:

  • 在虚拟机中引用的对象,如各个线程被调用的方法堆中使用到的参数,局部变量,临时变量
  • 在方法区中类静态属性引用对象
  • 方法区中常量引用的对象
  • 本地方法栈中 Native方法引用的对象
  • Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象等
  • 同步锁持有的对象
  • 反应Java虚拟机内部情况的JMXBean,JVMTI中注册的回调,本地代码缓存等

知识拓展 :引用
引用的类别分为强引用,软引用,弱引用,虚引用

强引用:类似于“Object obj = new Object()” 这种引用关系只要一直存在,垃圾收集器就不会回收掉对象

软引用:用来描述一些还算有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出时会把这些对象列入垃圾回收范围,让垃圾收集器进行二次回收 SoftReference 类 来实现软引用

弱引用:同样是描述非必需对象,但他的强度比软引用更弱,被软引用关联的对象只生存到下一次垃圾收集为止 WeakReference 类实现

虚引用: 幽灵引用,既不影响对象生存时间,只为在对象被垃圾回收时收到一个系统通知 PhantomReference类实现

知识再拓展 类回收

我们在上面已经知道了对象是否存活的判定方法,那么如何判定类是否存活呢
下面我们介绍一下类回收需要达成的条件

  • 该类所有实例都已经被回收
  • 加载该类的类加载器已经被回收 很难实现
  • 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类

所以呢,一般情况下很难达成类被回收条件的,即使达到类被回收条件,也只是被"允许"回收,不会像对象一样没有引用了就回收,所以类还是有很强的生存能力的嘛。

相关文章:

  • 2021-04-06
  • 2021-09-28
  • 2022-01-19
  • 2021-05-04
  • 2021-10-29
  • 2021-11-16
  • 2021-08-28
  • 2022-12-23
猜你喜欢
  • 2021-05-20
  • 2021-05-23
  • 2021-05-22
  • 2021-12-31
  • 2021-08-14
  • 2021-07-14
  • 2021-12-27
相关资源
相似解决方案