Java强引用软引用弱引用虚引用

Java有4种引用类型:强引用、软引用、弱引用、虚引用。

程序中一般只用强引用和软引用,软引用的优点在于内存不够时GC会主动回收,防止OutOfMemory异常。

参考:https://segmentfault.com/a/1190000015282652

强引用

平时程序中的引用就是强引用。如果一个对象具有强引用,GC一定不会回收它,即使内存不够用了。

软引用

如果一个对象只具有软引用,只有当内存不够时,GC会回收它。GC会先回收很久没用的软引用。

软引用的使用方法:

1
2
3
Person person = new Person("abc");
SoftReference<Person> = new SoftReference<Person>(person);
person = null; // 对象Person("abc")只剩下软引用

创建软引用对象SoftReference时,可以将软引用对象和一个引用队列ReferenceQueue关联,如果软引用所引用的对象被垃圾回收,JVM就会把这个软引用加入到与之关联的引用队列中。

弱引用

如果一个对象只具有弱引用,无论内存是否足够,到GC回收的时间时它都会被回收。弱引用也可以和一个引用队列ReferenceQueue关联。

弱引用的使用方法:

1
2
3
Person person = new Person("abc");
WeakReference<Person> = new WeakReference<Person>(person);
person = null; // 对象Person("abc")只剩下弱引用

虚引用

如果一个对象只具有虚引用,那么它和“没有引用”的对象无区别,随时都会被GC回收。虚引用必须和一个引用队列ReferenceQueue关联。