Java有四种引用:强引用、软引用、弱引用、虚引用。引入四种引用的目的:一是为了让程序员通过代码决定对象的生命周期;二是有利于JVM进行垃圾回收。
1.强引用
创建一个对象并将其赋值给一个引用变量,即Object o = new Object();
有引用变量指向的对象属于强引用,永远不会被GC。
只有函数执行完,没有引用关系;或者显性地将引用对象赋值为null,JVM才会回收该对象。
2.软引用:SoftReference
只有内存空间不足时,才会被GC回收。
应用场景:实例保存对一个object的软引用,用来实现内存敏感的高速缓存,eg:网页缓存、图片缓存,可以防止内存泄漏,增强程序的健壮性。
public class User {
private int id;
private String name;
public User() {};
public User(int id, String name) {
this.id = id;
this.name = name;
}
public string getName() {
return name;
}
}
User user = new User(1, "lily");
SoftReference<User> userSoft = new SoftReference<User>(user);
User = null;
String name = usersoft.getName();//可以访问到软引用的属性。
3. 弱引用:WeakReference
只要JVM执行了GC,弱引用对象都会被回收,无论内存是否充足。
4.虚引用:PhantomReference
虚引用不影响对象的生命周期。
虚引用必须与引用队列关联使用,虚引用对象会被放到引用队列中。在GC之前该引用队列中的虚引用对象是null,执行GC后,队列中才会有虚引用对象,但是无法get该对象。GC时会得到一个通知。
5.总结
强引用:不会被回收;
软引用:只有在内存不足才会被回收;
弱引用:执行GC时就会被回收,无论内存是否充足;
虚引用:不影响对象的生命周期,执行GC被回收时会受到通知。