java弱引用怎么手動釋放,十分鐘理解Java中的弱引用,十分鐘java引用

十分鐘理解Java中的弱引用,十分鐘java引用

本篇文章嘗試從What、Why、How這三個角度來探索Java中的弱引用,幫助大家理解Java中弱引用的定義、基本使用場景和使用方法。由于個人水平有限,敘述中難免存在不準確或是不清晰的地方,希望大家可以指出,謝謝大家:)

1. What——什么是弱引用?

Java中的弱引用具體指的是java.lang.ref.WeakReference類,我們首先來看一下官方文檔對它做的說明:

弱引用對象的存在不會阻止它所指向的對象被垃圾回收器回收。弱引用最常見的用途是實現規范映射(canonicalizing mappings,比如哈希表)。

假設垃圾收集器在某個時間點決定一個對象是弱可達的(weakly reachable)(也就是說當前指向它的全都是弱引用),這時垃圾收集器會清除所有指向該對象的弱引用,然后把這個弱可達對象標記為可終結(finalizable)的,這樣它隨后就會被回收。與此同時或稍后,垃圾收集器會把那些剛清除的弱引用放入創建弱引用對象時所指定的引用隊列(Reference Queue)中。

實際上,Java中存在四種引用,它們由強到弱依次是:強引用、軟引用、弱引用、虛引用。下面我們簡單介紹下除弱引用外的其他三種引用:

強引用(Strong Reference):通常我們通過new來創建一個新對象時返回的引用就是一個強引用,若一個對象通過一系列強引用可到達,它就是強可達的(strongly reachable),那么它就不被回收

軟引用(Soft Reference):軟引用和弱引用的區別在于,若一個對象是弱引用可達,無論當前內存是否充足它都會被回收,而軟引用可達的對象在內存不充足時才會被回收,因此軟引用要比弱引用“強”一些

虛引用(Phantom Reference):虛引用是Java中最弱的引用,那么它弱到什么程度呢?它是如此脆弱以至于我們通過虛引用甚至無法獲取到被引用的對象,虛引用存在的唯一作用就是當它指向的對象被回收后,虛引用本身會被加入到引用隊列中,用作記錄它指向的對象已被回收。

Why——為什么使用弱引用?

考慮下面的場景:現在有一個Product類代表一種產品,這個類被設計為不可擴展的,而此時我們想要為每個產品增加一個編號。一種解決方案是使用HashMap。于是問題來了,如果我們已經不再需要一個Product對象存在于內存中(比如已經賣出了這件產品),假設指向它的引用為productA,我們這時會給productA賦值為null,然而這時productA過去指向的Product對象并不會被回收,因為它顯然還被HashMap引用著。所以這種情況下,我們想要真正的回收一個Product對象,僅僅把它的強引用賦值為null是不夠的,還要把相應的條目從HashMap中移除。顯然“從HashMap中移除不再需要的條目”這個工作我們不想自己完成,我們希望告訴垃圾收集器:在只有HashMap中的key在引用著Product對象的情況下,就可以回收相應Product對象了。顯然,根據前面弱引用的定義,使用弱引用能幫助我們達成這個目的。我們只需要用一個指向Product對象的弱引用對象來作為HashMap中的key就可以了。

How——如何使用弱引用?

拿上面介紹的場景舉例,我們使用一個指向Product對象的弱引用對象來作為HashMap的key,只需這樣定義這個弱引用對象:

Product productA = new Product(...);

WeakReference weakProductA = new WeakReference<>(productA);

現在,若引用對象weakProductA就指向了Product對象productA。那么我們怎么通過weakProduct獲取它所指向的Product對象productA呢?很簡單,只需要下面這句代碼:

Product product = weakProductA.get();

實際上,對于這種情況,Java類庫為我們提供了WeakHashMap類,使用和這個類,它的鍵自然就是弱引用對象,無需我們再手動包裝原始對象。這樣一來,當productA變為null時(表明它所引用的Product已經無需存在于內存中),這時指向這個Product對象的就是由弱引用對象weakProductA了,那么顯然這時候相應的Product對象時弱可達的,所以指向它的弱引用會被清除,這個Product對象隨即會被回收,指向它的弱引用對象會進入引用隊列中。

引用隊列

下面我們來簡單地介紹下引用隊列的概念。實際上,WeakReference類有兩個構造函數:

//創建一個指向給定對象的弱引用

WeakReference(T referent)

//創建一個指向給定對象并且登記到給定引用隊列的弱引用

WeakReference(T referent, ReferenceQueue super T> q)

我們可以看到第二個構造方法中提供了一個ReferenceQueue類型的參數,通過提供這個參數,我們便把創建的弱引用對象注冊到了一個引用隊列上,這樣當它被垃圾回收器清除時,就會把它送入這個引用隊列中,我們便可以對這些被清除的弱引用對象進行統一管理。

參考資料

WeakReference (Java Platform SE 7 ) – Oracle Help Center

理解Java中的弱引用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件:推薦六款實用的錄頻軟件

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

安裝 openSUSE Leap 42.1 之后要做的 8 件事

導讀openSUSE Leap 確實是個巨大的飛躍&#xff0c;它允許用戶運行一個和 SUSE Linux 企業版擁有同樣基因的發行版。和其它系統一樣&#xff0c;為了實現最佳的使用效果&#xff0c;在使用它之前需要做些優化設置。下面是一些我在我的電腦上安裝 openSUSE Leap 之后做的一些事情…

Java8 Stream Collectors groupingBy使用

分組List并顯示其總數。 Test public void test8() {//3 apple, 2 banana, others 1List<String> items Arrays.asList("apple", "apple", "banana","apple", "orange", "banana", "papaya");Map…

操作系統:分享10個經常用的cmd命令

電腦高手操作電腦時&#xff0c;通常都是在“運行”中直接輸入“命令”來直接調出相應的操作。如果大家也想要像電腦高手一樣&#xff0c;但是卻又不知道“運行”命令有哪些&#xff1f;在這里&#xff0c;小編就為大家分享10個“運行”命令&#xff0c;讓大家體驗到成為電腦高…

matlab交叉耦合,交叉耦合矩陣綜合問題

編程計算N階耦合矩陣&#xff0c;基本都能算對&#xff0c;但是對于某些特殊參數會出現R1!RN&#xff0c;大家又出現類似的情況么&#xff1f;希望高手幫忙計算以下參數&#xff0c;看看是否能算出來。參數為ftz[-1.2i -1.4i 1.4i 1.2i -1.05i 1.05i];傳輸零點RL20;%帶內回波N …

idea創建Package時出現包名累加,而不是樹形結構解決方法

idea打開工程的時候包名疊在一起了 點擊箭頭處按鈕,把第一第二行勾去掉 如下 最終效果

電腦鍵盤中英文按鍵有哪些?有什么作用?

對于電腦鍵盤&#xff0c;相信大家并不陌生&#xff0c;而在電腦鍵盤上面有著很多按鍵&#xff0c;除了數字按鍵和字母按鍵之外&#xff0c;還有很多看不懂的英文按鍵。那么這些英文按鍵是什么意思呢&#xff1f;如果并不了解&#xff0c;那么小編就為大家介紹所有英文按鍵的意…

在github中使用pages上傳自己的網頁

轉載自&#xff1a;http://www.cnblogs.com/lijiayi/p/githubpages.html 學了前端小半年&#xff0c;如今寫了個自己的網頁想要去應聘&#xff0c;卻發現部署很麻煩&#xff0c;部署到阿里云之類&#xff0c;買域名啊啥的還要收費&#xff0c;說貴也不貴&#xff0c;但我就是傲…

使用lamba中stream 進行分組統計

對一個list中的元素進行分組&#xff0c;并統計各個元素出現的次數。放入map<String,Long>。 代碼如下: Test public void test8() {List<String> items Arrays.asList("1", "2", "3","4", "1", "3"…

php 表單select,表單控件select標簽是如何使用的

表單控件select標簽是用來創建下拉列表的&#xff0c;通過標簽來定義可用選項以及其他屬性來設置表單控件的選擇個數等。今天將介紹的是HTML中的表單控件select的用法&#xff0c;具有一定的參考價值&#xff0c;希望對大家有所幫助。【推薦課程&#xff1a;HTML教程】select標…

電腦經常死機是什么原因?如何解決?

目錄 一、電腦經常死機是什么原因&#xff1f; 二、電腦經常死機如何解決&#xff1f; ??????? 一、電腦經常死機是什么原因&#xff1f; 1、電腦頻繁死機&#xff0c;在進行CMOS設置時也會出現死機現象&#xff0c;一般由硬件問題引起的&#xff0c;散熱不良…

重量級框架

1.概述 重量級框架則強調高可伸縮性&#xff0c;適合與開發大型企業應用。輕量級框架側重于減小開發的復雜度&#xff0c;相應的它的處理能力便有所減弱&#xff08;如事務功能弱、不具備分布式處理能力&#xff09;&#xff0c;比較適用于開發中小型企業應用。輕量級框架和重量…

Win10磁盤占用達到100%,優化一下就解決了

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

2、IDEA以新窗口的形式打開多個項目

IDEA以新窗口的形式打開多個項目 修改1處如圖所示

160523、Oracle建立表空間和用戶

建立表空間和用戶的步驟&#xff1a; 用戶 建立&#xff1a;create user 用戶名 identified by "密碼"; 授權&#xff1a;grant create session to 用戶名; grant create table to 用戶名; grant create tablespace to 用戶名; …

Win10 該如何設置FTP呢,詳細設置步驟

復印&#xff0c;打印&#xff0c;掃描的日常操作是每個辦公人員的必備技能&#xff0c;我們來了解一下掃描至FTP的具體操作方法。 要使用FTP功能掃描文件到電腦&#xff0c;首先要需要一臺可以接收文件的FTP服務器&#xff0c;這個服務器我們可以借助第三方軟件搭建&#xff0…

數值的加減會改變python中id,在python中調用Nan值并更改為數字

ix已棄用&#xff0c;請不要使用它。在選項1我會用np.where-df df.assign(pronp.where(df.pro.isnull(), df.property_type, df.pro))dfid property_type1 property_type pro0 1 Condominium 2 2.01 2 Farm 14 14.02 3 House 7 7.03 4 Lots/Land 15 15.04 5 Mobile/Manufactur…

Linux和Windows操作系統有什么區別?

目錄 1、Linux系統的優缺點 2、Linux系統與Windows系統的區別 在所有操作系統中&#xff0c;Windows系統屬于最多用戶使用的操作系統&#xff0c;而這一次小編要來跟大家聊聊Linux系統&#xff0c;目前很多筆記本也已經開始預裝Linux系統了。那么Linux系統有什么優缺點呢&#…

idea自動生成not null判斷語句

自動生成not null這種if判斷&#xff0c;在IDEA里有很多種辦法&#xff0c;其中一種辦法你可能沒想到。 直接輸入notnull并回車&#xff0c;IDEA就好自動生成if判斷了

C#三層開發做學生管理系統

1.定義各個層 2.添加各個層之間的引用 DAL 層調用Model BLL層調用DAL和Model UI層調用BLL和Model層 Model層供各個層調用 3.根據數據庫建立實體類,每張表對應一個實體類 4.在DAL層調用MyTool類和SQLhelper類,添加system.Configuration 引用 并編寫app.config 在SqlHelper類調用…