对象已死吗?

在Java垃圾回收之前,需要判断对象是不是已经死掉,只有死掉的对象才能被GC回收,那么如何判断一个对象是不是已经死掉了呢?

一. 引用计数法

1. 给对象添加一个引用计数器,每当有一个对象引用它时+1,当引用失效时-1,任何时刻计数器为0的对象就是不可能再被引用的。

2. 实现简单,效率很高,但很难解决对象之间循环引用的问题。

二. 可达性分析

1. 基本思想:通过一系列称为GC Roots的对象作为起始点,从这些点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,此对象不可达。

2. 在Java中可以作为GC Roots的对象包括以下几种:虚拟机栈中引用的对象;方法区中类静态属性引用的对象;方法区中常量引用的对象;本地方法中JNI(Native方法)引用的对象。

三. 引用

1. 引用分为四种:强引用,软引用,弱引用,虚引用,强度逐渐减弱。

2. 强引用就是程序代码中普遍存在的引用。

3. 软引用是用来描述一些还有用但并非必须的对象。

4. 弱引用也是用来描述非必需对象的,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。

5. 虚引用又被称为幽灵引用或者幻影引用。

四. 生存还是死亡

1. 即使在可达性分析中不可达的对象,也并非是非死不可,只是处于缓刑阶段,要真正死亡至少要经历两次标记,这跟finalize有关。

2. finalize函数比较危险,尽量不用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容