NOTE
7.17 引用
1. 强软弱虚引用 1.1. 强 最普遍的引用。一个对象具有强引用,那么绝不会被回收。 - 例子 1.2. 软 内存足够的时候不会被回收,不足的时候会被回收。 使用SoftReference实现,一般用于缓存 - 例子 1.3. 弱 不管内存是否充足,一旦发生gc就会被回收 1.4. 虚 监控GC回
这是历史学习笔记,可能存在过时或不完整的理解。
1. 强软弱虚引用

1.1. 强
最普遍的引用。一个对象具有强引用,那么绝不会被回收。
- 例子
Object object = new Object();
System.out.println(object);//java.lang.Object@1b6d3586
System.gc();
System.out.println(object);//java.lang.Object@1b6d3586
1.2. 软
内存足够的时候不会被回收,不足的时候会被回收。 使用SoftReference实现,一般用于缓存
- 例子
//内存充足的情况
public static void softRefMemoryEnough()
{
Object obj1 = new Object();
SoftReference<Object> softReference = new SoftReference<>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
obj1 = null;
System.gc();//触发gc
System.out.println(obj1);
System.out.println(softReference.get());//软引用不会被回收
}
//内存不足的情况
//-Xms10m -Xmx10m -XX:+PrintGCDetails
public static void softRefMemoryNotEnough()
{
Object obj1 = new Object();
SoftReference<Object> softReference = new SoftReference<>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
obj1 = null;
try
{
byte[] bytes = new byte[1024 * 1024 * 30];
}catch (Exception e)
{
e.printStackTrace();
}
finally
{
System.out.println(obj1);
System.out.println(softReference.get());//软引用会被回收
}
}
1.3. 弱
不管内存是否充足,一旦发生gc就会被回收
public static void weakRefMemoryEnough()
{
Object obj1 = new Object();
WeakReference<Object> softReference = new WeakReference<>(obj1);
System.out.println(obj1);
System.out.println(softReference.get());
obj1 = null;
System.gc();
System.out.println(obj1);
System.out.println(softReference.get());
}
1.4. 虚
监控GC回收,没什么用。 虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
public static void xuTest() throws InterruptedException
{
Object object = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomReference = new PhantomReference<>(object, queue);
System.out.println(object);
System.out.println(phantomReference.get());
System.out.println(queue.poll());
System.out.println("-================");
object = null;
System.gc();
Thread.sleep(50);
System.out.println(object);
System.out.println(phantomReference.get());
System.out.println(queue.poll());
}
1.4.1. 使用场景
- WeakHashMap
public static void hashMapTest()
{
HashMap<Integer, String> map = new HashMap<>();
Integer key = new Integer(1);
map.put(key, "aaaaaaaaaa");
System.out.println(map);
key = null;
System.gc();
System.out.println(map);
}
public static void weakHashMapTest()
{
WeakHashMap<Integer, String> map = new WeakHashMap<>();
Integer key = new Integer(1);
map.put(key, "aaaaaaaaaa");
System.out.println(map);
key = null;
System.gc();
System.out.println(map);
}