一、强引用(StrongReference)
不会回收有强引用的对象。
String str ="hello";//普通声明就是强引用
str = null;//赋值为null,JVM在合适的时间就会回收该对象
除了强引用,其他的引用都需要借助java.lang.ref包下的抽象类 Reference 的子类来进行包装操作了!在java.lang.ref包下,Reference类有3个具体的实现类,
SoftReference
、WeakReference
和PhantomReference
,分别表示软引用、弱引用和虚引用!
二、软引用(SoftReference)
如果内存空间足够,就不会回收它;如果内存空间不足,就会回收。
String str=new String("abc"); // 强引用
SoftReference<String> soft = new SoftReference<String>(str); // 软引用
//软引用包含的对象可以通过get()获取到
soft.get();
-------
//提醒系统进行一个垃圾收集
System.gc();
System.out.println(soft.get() == null);//打印false,说明软引用中的对象并没有被回收!
三、弱引用(WeakReference)
不管当前内存空间足够与否,都会回收。
// 创建一个引用队列
ReferenceQueue<String> rq = new ReferenceQueue<String>();
// 实现一个弱引用,将强引用类型hello和是实例化的rq放到弱引用实现里面
WeakReference<String> weak = new WeakReference<String>(new String("hello"), rq);
// 通过弱引用get方法获取强引用中创建的内存空间hello值
System.out.println(weak.get());
System.gc(); //通知JVM的gc进行垃圾回收
System.out.println(weak.get() == null);//打印true,说明弱引用中的对象被回收了!
-----------
//创建一个弱引用,包含一个对象
WeakReference<Integer> weak = new WeakReference<>(new Integer("23456"));
//弱引用包含的对象可以通过get()获取到
Integer weakNum = weak.get();
四、虚引用(PhantomReference)
和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
//创建一个虚引用,包含一个对象
ReferenceQueue<Integer> intRq = new ReferenceQueue<>();
PhantomReference<Integer> phantom = new PhantomReference<>(new Integer("23456"),intRq);
//引用包含的对象可以通过get()获取到
Integer phantomNum = phantom.get();
- 无法通过虚引用来获取对一个对象的真实引用。
- 虚引用必须和引用队列 (ReferenceQueue)联合使用。
- 唯一的用处:能在对象被GC时收到系统通知。
- 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。