JAVA的四种引用
强引用:
一个对象被一个强引用所持有,那么这个对象便不会被垃圾回收器回收。这也是我们最常用的引用方式。
特点:
- 可以直接访问目标对象
- 不会被垃圾回收器回收
- 可能会导致内存泄漏
举例:
//这里Object便是被一个强引用所持有
Object oj = new Object();
软引用:
一个对象若是具有软引用。那么,当内存足够时,及时垃圾回收器扫描到该对象,垃圾回收器也不会对该对象进行回收。若内存不足时,垃圾回收器扫描到该对象,便会回收这些对象的内存。
特点:
- 通过SoftReference类来使用。
- 生命周期比强引用短。
- 当内存足够时,垃圾回收器不会对其指向的对象进行回收;内存不足时,当垃圾回收器扫描到该引用指向的对象时,便会回收该对象。
//创建一个String类型的对象
String str = new String();
//将String类型的对象让软引用持有
SoftReference<String> sr = new SoftReference<String>(str);
弱引用:
只具有弱引用的对象,会具有更短的生命周期。当垃圾回收器扫描到该引用指向的对象时,便会对对象进行回收。
特点:
- 具有更短的生命周期
- 通过WeakReference类实现
- 无论内存是否充足,当垃圾回收器扫描到该引用所持有的对象,便会对其对象进行回收
- 可以与引用队列 连用(ReferenceQueue)联用,当弱引用持有的对象被垃圾回收器回收,那么便将该引用添加到与之相关联的引用对象中。
//创建一个String类型的对象
String str = new String();
//将String类型的对象让弱引用持有
WeakReference<String> sr = new WeakReference<String>(str);
虚引用(幻象引用):
虚引用跟没有引用没有什么区别,因为它随时都会被回收,用来跟踪对象被垃圾回收器回收的活动,必须与引用队列连用。
特点:
- 通过PhantomReference类使用。
- 随时会被回收
- 用来跟踪对象被垃圾回收器回收的这个活动
- 必须与引用队列联用
String str = new String();
//创建一个引用队列
ReferenceQueue<String> queue = new ReferenceQueue<String>();
//使用虚引用持有对象,并将引用添加到关联的引用队列中
PhantomReference<String> pr = new PhantomReference<String>(str, queue);