强引用、软引用、弱引用、虚引用

强引用
强引用就是指在程序代码之中普遍存在的,比如下面这段代码中的object
和str
都是强引用:
Object object = new Object();
只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。比如下面这段代码:
/**
* 强引用示例
*
* @author tianwc
* @date 2018-11-22
*/
public class StrongReferenceMain {
public static void main(String[] args) {
StrongReferenceMain strongReferenceMain = new StrongReferenceMain();
strongReferenceMain.test();
}
public void test() {
Object object = new Object();
String str = "hello";
// ...
}
}
软引用
软引用适用于内存不足时回收对象。被软引用关联的对象只有在内存不足时才会被回收。
/**
* 软引用示例
*
* @author tianwc
* @date 2018-11-21
*/
public class SoftReferenceMain {
public static void main(String[] args) {
SoftReference<String> sr = new SoftReference<>("hello");
System.out.println(sr.get());
// ...
}
}
弱引用
弱引用适用于防止内存泄露。被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
/**
* 弱引用示例
*
* @author tianwc
* @date 2018-11-21
*/
public class WeakReferenceMain {
public static void main(String[] args) {
WeakReference<String> sr = new WeakReference<>("hello");
System.out.println(sr.get());
// ...
}
}
进一步理解软引用和弱引用
对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,使用得最多的就是软引用和弱引用,这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。
针对上面的特性,软引用适合用来进行缓存,当内存不够时能让JVM回收内存,弱引用能用来在回调函数中防止内存泄露。因为回调函数往往是匿名内部类,隐式保存有对外部类的引用,所以如果回调函数是在另一个线程里面被回调,而这时如果需要回收外部类,那么就会内存泄露,因为匿名内部类保存有对外部类的强引用。
参考:https://www.cnblogs.com/alias-blog/p/5793108.html
老铁们帮忙点个赞