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);
上一篇 下一篇

猜你喜欢

热点阅读