Java 引用强度


一、四个级别

Java 提供了4个级别的引用:强引用软引用弱引用虚引用。除了强引用,其他几种引用都可以在 java.lang.ref 中找到。

二、逐一介绍

1. 强引用

就是一般的引用类型。强引用的对象是可及的,不会被垃圾回收。如:

StringBuffer sb = new StringBuffer("123");

假设该语句是在方法体内运行的,那么变量 sb 将会被分配在栈帧中的局部变量表里,而对象 StringBuffer 将会被分配在上。

StringBuffer sb1 = sb;

此时,局部变量表又多了一个变量 sb1,并且它和 sb 一样都指向同一个对象。

strong.png

2. 软引用

软引用是比强引用弱一点的引用。如果对象只有软引用,当内存空间不足时,对象就会被回收(必须在虚拟机抛出 OutOfMemoryError 之前回收),通常用来实现缓存。用 SoftRefrence 实现。

SoftReference<User> userSoftReference = new SoftReference<User>(u);

userSoftReference.get();

垃圾回收时,软引用未必会被回收,但是一旦内存紧张,软引用一定会被回收。

3. 弱引用

弱引用是一种比软引用弱的引用类型。在系统垃圾回收时,如果一个对象的引用都是弱引用,那么不管系统堆空间如何都会被回收。用 WeakReference 实现。

WeakReference<User> userSoftReference = new WeakReference<User>(u);

userSoftReference.get();

4. 虚引用

是最弱的一种引用,随时都可能被回收。当试图通过虚引用的 get() 方法取得强引用时,总是会失败。用 PhantomReference 实现。


reachable.png

三、应用

  1. ReferenceQueue

  2. WeakHashMap