Java中的四种引用类型
Java中的四种引用类型
Java中的变量有两种数据类型,分别是基本数据类型和引用数据类型,这篇文章就来讲一下Java中的引用类型。Java为引用类型专门定义了一个类叫做Reference。而引用类型Reference跟Java垃圾回收机制息息相关,所以我们有必要理解四种引用类型,才可以更加深入的理解Java的垃圾回收是怎么工作的。
一、强引用:
Java中默认的引用就是强引用,任何一个对象的赋值操作就产生了对这个对象的强引用。例如
Object o = new Object(); // 我们创建了一个Object对象,并复制给了o,这时o就是Object对象的一个强引用。
强引用的对象在发生GC时不会被回收。
二、软引用:
有用但不是必须的对象,发生GC时不一定会回收该对象,只有在内存不够用时才会被回收。软引用适合缓存使用的场景。下面看一下软引用对应的类SoftReference:
// 继承Reference抽象类
public class SoftReference<T> extends Reference<T> {
// 有两个构造方法
/**
* @param referent 软引用的对象
*/
public SoftReference(T referent) {
super(referent);
/*
timestamp:记录每次调用get()方法获取软引用对象时的时间戳,虚拟机在清除
软引用时可能会用到。
*/
this.timestamp = clock;
}
/**
* @param referent 软引用的对象
* @param ReferenceQueue 存储待回收的引用对象,也就是Reference的实例对象。
软引用自身需要配合引用队列来释放。
*/
public SoftReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
this.timestamp = clock;
}
}
例子:
SoftReference<Object> soft = new SoftReference<>(new Object()); // 当内存不足时Object对象就会被回收
三、 弱引用:
有用但不是必须的对象,在每次 GC 时都会被回收,这是和软引用的主要区别。下面看一下弱引用对应的类WeakReference:
// 同样继承Reference抽象类,构造方法也和SoftReference类似
public class WeakReference<T> extends Reference<T> {
public WeakReference(T referent) {
super(referent);
}
public WeakReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
四、虚引用(幽灵引用/幻影引用):
无法通过虚引用获得对象,虚引用的用途是在GC时返回一个通知,即在GC的过程中,如果发现有PhantomReference,GC则会将引用放到ReferenceQueue中,程序员可通过ReferenceQueue知道发生了GC。下面看一下虚引用对应的类PhantomReference:
public class PhantomReference<T> extends Reference<T> {
// 虚引用对象只有一个构造函数,必须传入ReferenceQueue
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
下一篇:
Java方法练习题(方法重载、递归)
