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

歡迎訪問 生活随笔!

生活随笔

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

java

java引用 弱引用_了解Java弱引用

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

java引用 弱引用

我最近沒來得及關注這個博客,最重要的是,我沒有為與技術界的所有人保持聯系而致歉。 最近,我偶然發現了自Java 1.2起可用的java.lang.ref軟件包,但具有諷刺意味的是,幾天前我才知道它。 在瀏覽了幾篇有關各種引用類型和java doc的文章時,我非常著迷,并渴望通過使用一些與引用相關的代碼來弄臟我的手。

我不是要談的java.lang.ref包中可用的每個引用類,因為它已經是很好的解釋在這里 。 讓我們看一下我編寫的以下代碼片段,以了解WeakReference的基本操作。

import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; public class ReferencesTest { private WeakReference<Map<Integer, String>> myMap; public static void main(String[] args) { new ReferencesTest().doFunction(); } private void doFunction() { Map<Integer, String> map = new HashMap<Integer, String>(); myMap = new WeakReference<Map<Integer, String>>(map); map = null; int i = 0; while (true) { if (myMap != null && myMap.get() != null) { myMap.get().put(i++, "test" + i); System.out.println("im still working!!!!"); } else { System.out .println("*******im free*******"); } } } }

首先,我定義了一個弱引用實例變量,向其分配在doFunction()方法中初始化的HashMap實例。 然后,數據通過弱引用實例而不是直接通過我們創建的哈希圖的具體實例輸入到地圖。 由于WeakReferences的工作方式,我們檢查地圖是否為空。

在程序執行期間,如果沒有軟引用或強引用綁定到弱引用,則將首先對其進行垃圾收集。 因此,如果內存非常低,或者垃圾收集器認為適當的時間和時間,則弱引用是垃圾收集,這就是為什么我在代碼中包含else語句以顯示這種情況的原因。 通過設置最小值–Xms–Xmx來運行此命令,以了解其工作原理,因為否則必須等待更長的時間才能獲得內存不足異常。 然后將WeakReference實現更改為SoftReference實現,并查看程序在幾次迭代后實際上崩潰了。 這是由于以下事實:SoftReferences僅保證在發生OutOfMemory錯誤之前清理內存。 但是,有了WeakReference,該程序就可以繼續運行而不會停止,因為它幾乎總是可以進行垃圾回收,并且我們可以重新初始化緩存并繼續填充緩存。

關于弱引用的好處是,我認為這是實現內存中高速緩存的最佳方法之一,當我們需要保持數據不發生持續變化但經常在內存中訪問且成本高昂時,通常會自行實現對于像JBoss緩存或EHCache這樣的成熟的緩存實現而言,這實在太多了。 通常,我已經實現了緩存解決方案,還看到了類似于以下代碼段的生產代碼。

import java.util.HashMap; import java.util.Map; public class CacheTest { private Map<String, Object> myAwesomeCache = new HashMap<String, Object>(100); public Object getData(String id){ Object objToReturn = null; if(myAwesomeCache.containsKey(id)){ objToReturn = myAwesomeCache.get(id); }else{ // retrieve from the database and populate the in memory cache map } return objToReturn; } }

這只是一個非常基本的級別的實現,它可以使我們有時會使用Maps來構建內存緩存實現。 我們需要注意的事實是,盡管此實現沒有本質上的錯誤,但是在您的應用程序內存不足的情況下,如果垃圾回收器可以將其從內存中刪除以釋放一些內存,這將是一個理想的選擇。其他需要它的過程。 但是,由于此映射是一個強大的參考,因此垃圾回收器無法將此參考標記為符合收集條件。 更好的解決方案是將緩存實現從HashMap更改為WeakHashMap 。

Javadoc指定了有關WeakHashMap的以下內容;

“基于哈希表的具有弱鍵的Map實現。 如果WeakHashMap中的條目不再是普通使用的鍵,則該條目將被自動刪除。 更準確地說,給定鍵的映射的存在不會阻止該鍵被垃圾收集器丟棄,即被終結化,終結和回收。 當一個鍵被丟棄時,它的條目將被有效地從映射中刪除,因此此類的行為與其他Map實現有所不同。”

因此,回想起來,我相信只要您需要內存中的緩存實現,并且內存對您而言至關重要,那么使用WeakHashMap將會是有益的。

總結了我對參考資料包的發現,并邀請大家分享您在這方面的經驗,對此深表感謝。

干杯

參考:在“ 我的旅程” IT博客中,從我們的JCG合作伙伴 Dinuka Arseculeratne 了解Java弱引用


翻譯自: https://www.javacodegeeks.com/2012/01/understanding-java-weak-references.html

java引用 弱引用

總結

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

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