参考:java中四种引用类型
简介
在java1.2开始,为了使程序能更加灵活的控制对象的生命周期,将对象的引用分为四种级别.
详细说明
- 强引用(StrongReference)
强引用是使用最广泛的引用.如果一个对象具有强引用,那么垃圾回收器据对不会回收它.当空间不足时,jvm宁愿抛出OutOfMemoryError错误
,是程序异常终止,也不会通过回收强引用的对象来解决内存不足
的问题.
如果想中断强引用与某个对象的联系
,可以显式的将引用地址赋值为null
,这样一来,JVM就会在合适的时间回收该对象.
People P = new People("张三",20);
P = null;
2.软引用(SoftReference)
如果一个对象只具有软引用
,而且内存空间足够
,垃圾回收器就不会回收
它.
如果内存空间不足
,就会回收
这些对象的内存
软引用非常适合于创建缓存
,当系统内存不足的时候,缓存的内容是可以被释放的.
public class soft {
public static void main(String[] args) {
//软引用 作用之 缓存
SoftReference<MyArray> softReference = new SoftReference(new MyArray());
System.out.println(softReference.get()); //内存不够时回收
byte[] arr = new byte[1024*1024*3];
System.gc();
System.out.println( softReference.get());
}
}
class MyArray {
byte[] arr = new byte[1024 * 1024 * 3];
}
- 弱引用(WeakReference)
它的作用是引用一个对象,但是并不阻止该对象被回收,GC发生
的时候,会立即回收
弱引用对象.
使用场景:
- 网页缓存
- WeakHashMap : 在哈希表中,如果哈希表对象对键值对是
强引用
,只要哈希表对象存在,所包含的键和值是不会被回收
的.最终可能消耗JVM全部的内存,
解决的办法就是使用弱引用引用
这些对象,这样哈希表中的键和值都能被回收
.
WeakHashMap实际应用: 可以用来保存聊天记录.
public class weakReference {
public static void main(String[] args) {
//弱引用 weak Reference 使用场景 : 网页缓存
WeakReference weakReference = new WeakReference(new people());
System.out.println(weakReference.get());
System.gc();//只是给了一个信号,具体回收时机还是由JVM决定
System.out.println(weakReference.get());
}
}
class people {
String name;
}
4. 虚引用(PhantomReference)
Java的对象终止机制(finalization).在Object类里面有个finalize方法,其设计的初衷是在一个对象被真正回收之前,可以执行一些清理的工作
,就通过finalize()实现
.
但是gc的时间是不能确定
的,.虚引用可以解决这个问题,垃圾回收器回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之关联的引用队列
中。程序可以通过判断引用队列中是否已经加入了虚引用
,来了解被引用的对象是否将要被垃圾回收。然后在回收之前采取必要的操作
.
更通俗的来讲 :GC之后能找出来刚刚被回收的那个对象的地址
使用场景: 主要用来实现精细的内存使用控制
.