日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 中的 Reference

發布時間:2023/12/10 java 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 中的 Reference 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

 1、強引用(StrongReference)

    強引用不會被GC回收,并且在java.lang.ref里也沒有實際的對應類型。舉個例子來說:
    Object obj = new Object();
    這里的obj引用便是一個強引用,不會被GC回收。

  2、軟引用(SoftReference)

    軟引用在JVM報告內存不足的時候才會被GC回收,否則不會回收,正是由于這種特性軟引用在caching和pooling中用處廣泛。軟引用的用法:

Object obj = new Object(); SoftReference<Object> softRef = new SoftReference(obj); // 使用 softRef.get() 獲取軟引用所引用的對象 Object objg = softRef.get();

  3、弱引用(WeakReference)

    當GC一但發現了弱引用對象,將會釋放WeakReference所引用的對象。弱引用使用方法與軟引用類似,但回收策略不同。

  4、虛引用(PhantomReference)

    當GC一但發現了虛引用對象,將會將PhantomReference對象插入ReferenceQueue隊列,而此時PhantomReference所指向的對象并沒有被GC回收,而是要等到ReferenceQueue被你真正的處理后才會被回收。虛引用的用法:

package com.asiainfo.proxydemo;import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference;public class SoftReferenceDemo {//軟引用在JVM報告內存不足的時候才會被GC回收,否則不會回收,正是由于這種特性軟引用在caching和pooling中用處廣泛。軟引用的用法public static void soft(){Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();SoftReference<Object> softRef = new SoftReference<Object>(obj, refQueue);System.out.println(softRef.get()); // java.lang.Object@f9f9d8System.out.println(refQueue.poll());// null// 清除強引用,觸發GCobj = null;System.gc();System.out.println(softRef.get());try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(refQueue.poll());}//當GC一但發現了弱引用對象,將會釋放WeakReference所引用的對象。弱引用使用方法與軟引用類似,但回收策略不同。public static void weak(){Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();WeakReference<Object> weakRef = new WeakReference<Object>(obj, refQueue);System.out.println(weakRef.get());System.out.println(refQueue.poll());obj = null;System.gc();System.out.println(weakRef.get());System.out.println(refQueue.poll());}// 如果obj被置為null,當GC發現了虛引用,GC會將phanRef插入進我們之前創建時傳入的refQueue隊列// 注意,此時phanRef所引用的obj對象,并沒有被GC回收,在我們顯式地調用refQueue.poll返回phanRef之后// 當GC第二次發現虛引用,而此時JVM將phanRef插入到refQueue會插入失敗,此時GC才會對obj進行回收public static void phantom() throws InterruptedException{Object obj = new Object();ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();PhantomReference<Object> phanRef = new PhantomReference<Object>(obj, refQueue);/// 調用phanRef.get()不管在什么情況下會一直返回nullSystem.out.println(phanRef.get());System.out.println(refQueue.poll());obj = null;System.gc();System.out.println(phanRef.get());System.out.println(refQueue.poll());Thread.sleep(300);System.out.println(refQueue.poll());}public static void main(String[] args) {try {SoftReferenceDemo.phantom();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}} }

弱引用與虛引用的用處

  軟引用很明顯可以用來制作caching和pooling,而弱引用與虛引用呢?其實用處也很大,首先我們來看看弱引用,舉個例子:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( object );} }

所有我添加進 registeredObjects 中的object永遠不會被GC回收,因為這里有個強引用保存在registeredObjects里,另一方面如果我把代碼改為如下:

class Registry {private Set registeredObjects = new HashSet();public void register(Object object) {registeredObjects.add( new WeakReference(object) );}}

現在如果GC想要回收registeredObjects中的object,便能夠實現了,同樣在使用HashMap如果想實現如上的效果,一種更好的實現是使用WeakHashMap。

而虛引用呢?我們先來看看javadoc的部分說明:

Phantom references are useful for implementing cleanup operations that are necessary before an object gets garbage-collected. They are sometimes more flexible than the?finalize()?method.

翻譯一下:

虛引用在實現一個對象被回收之前必須做清理操作是很有用的。有時候,他們比finalize()方法更靈活。

很明顯的,虛引用可以用來做對象被回收之前的清理工作

參考:http://www.cnblogs.com/newcj/archive/2011/05/15/2046882.html

總結

以上是生活随笔為你收集整理的Java 中的 Reference的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。