一、四个级别
Java 提供了4个级别的引用:强引用
、软引用
、弱引用
和虚引用
。除了强引用,其他几种引用都可以在 java.lang.ref
中找到。
二、逐一介绍
1. 强引用
就是一般的引用类型。强引用的对象是可及的,不会被垃圾回收。如:
StringBuffer sb = new StringBuffer("123");
假设该语句是在方法体内运行的,那么变量 sb
将会被分配在栈
上栈帧
中的局部变量
表里,而对象 StringBuffer
将会被分配在堆
上。
StringBuffer sb1 = sb;
此时,局部变量表又多了一个变量 sb1,并且它和 sb 一样都指向同一个对象。
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
实现。
三、应用
-
ReferenceQueue
-
WeakHashMap