写点什么

Java 对象还活着么 (画画思维导图)

用户头像
Beldon.Wu
关注
发布于: 3 小时前


对象还活着吗

引用计数法

方法

  • 对象被引用的时候+1,引用生效的时候-1,当计数器为 0 时达到回收条件

缺陷

  • 对象互相引用时就无法达到回收条件

可达性分析

方法

  • 从 GC Roots 出发往下找,在引用路径(引用链)上出现过的对象是可达的,反之则不可达,即可被回收

GC Roots 对象

  • 栈帧中本地变量表中引用的对象

  • 本地方法栈中 JNI 引用的对象

  • 方法去中静态属性引用的对象

  • 方法去中常量引用的对象

方法区回收

回收废弃常量(条件)

  • 常量没有被任何地方引用

回收无用的类(条件)

  • 该类所有实例都已经被回收

  • 该类的 ClassLoader 已经被回收

  • 该类的 Class 对象没有被引用,而且无法在任何地方通过反射访问该类的方法

引用(Reference)

强引用(StrongReference)

  • 正常使用的类型,不需要显式定义,只要没有任何引用就可以回收

  • 有哪些方法能达到强引用效果

  • 基本引用类型

  • 通过底层 API—这就是所谓的设置 Reachability Fence

软引用(SoftReference)

  • 如果一个对象只剩下软引用,在 JVM 内存不足的时候会将这个对象进行回收

弱引用(WeakReference)

  • 如果对象只剩下弱引用,那 GC 的时候就会回收

虚引用(PhantomReference)

  • 比较特殊,任何时候都可能被回收,可用用来实现类似 Object.finalize 的功能

引用队列(ReferenceQueue)

Reachability Fence(可达性栅栏)

Why

根据规范,一个对象没有强引用,则符合垃圾回收的标准。但是!如果有的对象,没有强引用,但是部分属性还需要被使用,就会导致问题。Reachability Fence 就是通过一些方法,在没有强引用时,告知 JVM 这些对象正在被使用,先不要进行 GC。


  • 如果有的对象,没有强引用,但是部分属性还需要被使用,就会导致问题

How

class Resource {   private static ExternalResource[] externalResourceArray = ...
int myIndex; Resource(...) { myIndex = ... externalResourceArray[myIndex] = ...; ... } protected void finalize() { externalResourceArray[myIndex] = null; ... } public void action() { try { // ... int i = myIndex; Resource.update(externalResourceArray[i]); } finally { Reference.reachabilityFence(this); } } private static void update(ExternalResource ext) { ext.status = ...; } }
复制代码


  • Reachability Fence 就是通过一些方法,在没有强引用时,告知 JVM 这些对象正在被使用,先不要进行 GC。

  • 使用 Reference.reachabilityFence(this);

cleaner 机制

发布于: 3 小时前阅读数: 3
用户头像

Beldon.Wu

关注

我就是我,不一样的烟火 2018.04.30 加入

https://github.com/beldon

评论

发布
暂无评论
Java对象还活着么(画画思维导图)