Java四种引用

强引用:只要引用存在,垃圾回收器永远不会回收

    Object obj = new Object();

    而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。

 

当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 

 

软引用:非必须引用,内存溢出之前进行回收,可以通过以下代码实现

    

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();

    这时候sf是对obj的一个软引用,通过sf.get()方法可以取到这个对象,当然,当这个对象被标记为需要回收的对象时,则返回null;

    软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据。

 

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

 

  那为什么需要软引用?

    软引用主要用户实现类似缓存的功能,在内存足够的情况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自动删除这部分缓存数据,从真正的来源查询这些数据

 

弱引用:第二次垃圾回收时回收,可以通过如下代码实现

    

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();
wf.isEnqueued();//返回是否被垃圾回收器标记为即将回收的垃圾
//弱引用是在第二次垃圾回收时回收,短时间内通过弱引用取对应的数据,可以取到,当执行过第二次垃圾回收时,将返回null。
//弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,可以通过弱引用的isEnqueued方法返回对象是否被垃圾回收器标记。

 

只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。  

  为什么需要弱引用?

    弱引用主要用于监控对象是否已经被垃圾回收器标记为即将回收的垃圾,

 

    

虚引用:垃圾回收时回收,无法通过引用取到对象值,可以通过如下代码实现

 

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj, new ReferenceQueue<Object> ());
obj=null;
pf.get();//永远返回null
pf.isEnqueued();//返回是否从内存中已经删除
//虚引用是每次垃圾回收的时候都会被回收,通过虚引用的get方法永远获取到的数据为null,因此也被成为幽灵引用。
//虚引用主要用于检测对象是否已经从内存中删除。

 

虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

 

 为什么需要虚引用?

  虚引用主要用于检测对象是否已经从内存中删除

 

 

 

 

  

 

posted @ 2018-03-16 11:05  jianhuazhao  阅读(259)  评论(0编辑  收藏  举报