java四种引用
2018-12-02 本文已影响0人
春苟哈皮
java存在着四种饮用方式,他们是
引用类型 | 取得目标对象方式 | 垃圾回收条件 | 是否可能内存泄漏 |
---|---|---|---|
强引用 | 直接调用 | 不回收 | 可能 |
软引用 | 通过 get()方法 | 视内存情况回收 | 不可能 |
弱引用 | 通过 get()方法 | 永远回收 | 不可能 |
虚引用 | 无法取得 | 不回收 | 可能 |
这四种引用方式和jvm垃圾回收有着密切的联系。
1. 强引用
所有new
出来的对象都是强引用。虚拟机宁可跑出OutOfMemoryError
错误也不会去回收强引用。
值得注意的是:如果想中断或者回收强引用对象,可以显式地将引用赋值为null,这样的话JVM就会在合适的时间,进行垃圾回收。
Object obj = new Object();
2. 软引用
当一个对象拥有软引用,那么在虚拟机内存充足的情况下是不会回收的,如果内存不足则会被回收。
SoftReference<String[]> softBean = new SoftReference<String[]>(new String[]{"a", "b", "c"});
3. 弱引用
无论内存充足与否,只要垃圾回收线程扫描到弱引用,都会回收他的内存。
不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
WeakReference<String[]> weakBean = new WeakReference<String[]>(new String[]{"a", "b", "c"});
虚引用
一个对象如果仅拥有虚引用,实际上这个对象是无法被使用的。在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
ReferenceQueue<String[]> referenceQueue = new ReferenceQueue<String[]>();
PhantomReference<String[]> referent = new PhantomReference<String>(new String[]{"a", "b", "c"}, referenceQueue);