如何判断对象已死

2019-07-25  本文已影响0人  来醉一场

如何确定对象是“活着”还是已经“死去”?

一、判断对象存活的算法

1、引用计数法(未使用)

判定条件:

特点:

2、可达性分析法

判定条件:

在 Java 语言中,可作为 GC Roots 的对象包括下面几种:

二、生存还是死亡

1、再谈引用

  无论通过引用计数法还是可达性分析算法判断对象的引用链是否可达,判定对象是否存活都与引用有关。


   JDK 1.2 之后,Java 对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4种,引用强度依次减弱。

2、生存还是死亡

   即使在可达性分析法中不可达的对象,也并非是“非死不可”,这时候处于“缓刑”阶段,需要以下两次标记会能宣告一个对象死亡:

任何一个对象的 finalize() 方法都只会被系统自动调用一次,如果对象面临下一次回收,它的 finalize() 方法不会被再次执行。

3、回收方法区(1.8 之后 ?)

   永久代的垃圾回收两部分内容:废气常量和无用的类。回收废弃常量与回收 Java 堆中的对象非常类似。

   判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻的多:

   虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样,不使用了就必然会回收。是否对类进行回收,HotSpot 虚拟机提供了 -Xnoclassgc 参数进行控制,还可以使用 -verbose:class 以及 -XX:+TraceClassLoading、-XX:+TraceClassUnLoading 查看类加载和卸载信息,其中 -verbose:class 和 -XX:+TraceClassLoading 可以在 Product 版的虚拟机中使用,-XX:+TraceClassUnLoading 参数需要 FastDebug 版的虚拟机支持。

   在大量使用反射、动态代理、CGLib 等字节码框架、动态生成 JSP 以及 OSGi 这类频繁自定义 ClassLoader 的场景都需要虚拟机具备卸载的功能,以保证永久代不会溢出。

上一篇下一篇

猜你喜欢

热点阅读