06-判断对象是否已死

2021-04-07  本文已影响0人  紫荆秋雪_文

一、引用计数算法

Java虚拟机并不是通过引用计数算法来判断对象是否存活的

二、可达性分析算法(Reachability Analysis)

当前主流的商用程序语言(Java、C#)的内存管理子系统,都是通过可达性分析算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链(ReferenceChain)”,如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots 到这个对象不可达时,则证明此对象是不可能再被使用的


可达性算法思路.png

在Java技术体系里面,固定可以作为 GC Roots 的对象包括以下几种

三、引用

无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可达,判断对象是否存活都和 “引用” 离不开关系。在JDK1.2版之前,Java里面的引用是很传统的定义:如果reference类型的数据中存储的数值代表的是另外一块内存的额起始地址,就成该reference数据是代表某块内存、某个对象的引用。这种定义并没有什么不对,只是现在看来有些过于狭隘了,一个对象在这种定义下只有 “被引用” 或者 “未被引用” 两种状态,对于描述一些 “食之无味,弃之可惜”的对象就显得无能为力。譬如我们希望能描述一类对象:当内存空间还足够时,能保留在内存之中,如果内存空间在进行垃圾收集后仍然非常紧张,那就可以抛弃这些对象——很多系统的缓存功能都符号这样的引用场景。

1、JDK1.2之后,Java引用

2、强引用(Strongly Reference)

强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象

// 强引用
Object obj = new Object()

3、软引用(Soft Reference)

软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK1.2之后提供了 SoftReference 类 来实现软引用

4、弱引用(Weak Reference)

弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发送为止。当垃圾收集开始工作,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK1.2之后提供了WeakReference类 来实现弱引用

5、虚引用(Phantom Reference)

虚引用也称为 “虚灵引用” 或者 “幻影引用”,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。在JDK1.2之后提供了PhantomReference类 来实现虚引用

四、生存还是死亡

五、回收方法区

1、方法区的垃圾收集主要回收两部分内容

2、判定一个类型是否属于“不再被使用的类”比较苛刻了。需要同时满足下面三个条件

上一篇 下一篇

猜你喜欢

热点阅读