再談有關JVM中的四種引用

1.強引用

強引用就是我們平時使用最多的那種引用,就比如以下的代碼

//創建一個對象
Object obj = new Object();//強引用

這個例子就是創建了一個對象并建立了強引用,強引用一般就是默認支持的當內存不足的時候,JVM開始垃圾回收,對于強引用的對象,就算是出現了OOM也不會回收對象。即使在解除對對象的強引用后,只要系統內存充足,垃圾回收器不會立即回收對象。強引用使得對象在被引用時一直保持有效,直到引用被顯式解除。

以下三種引用就是比較不常見的了,這三種引用雖然叫引用但是和我們理解的那種棧上的變量指向堆上的對象的指針不是一回事。

千萬不要將軟弱虛這三種引用理解為那種棧上的變量指向堆上的對象的指針。

軟引用、弱引用、虛引用:這三種引用其實就是一個個的類,通過對應的類名翻譯過來的中文名稱。

// 軟引用
public class SoftReference<T> extends Reference<T> {}// 弱引用
public class WeakReference<T> extends Reference<T> {}// 虛引用
public class PhantomReference<T> extends Reference<T> {}

?

2.軟引用

發生了垃圾回收,并且回收后內存仍然不足,并且被軟引用指向的對象沒有強引用,那么被軟引用指向的對象就會被回收。

public class SoftReferenceDemo {public static void main(String[] args) {Object a = new Object();SoftReference softReference = new SoftReference<>(a);//軟引用//a和軟引用指向同一個對象System.out.println(a);//java.lang.Object@4554617cSystem.out.println(softReference.get());//java.lang.Object@4554617c//內存夠用,軟引用不會被回收a = null;System.gc();//內存夠用不會自動gc,手動喚醒gcSystem.out.println(a);//nullSystem.out.println(softReference.get());//java.lang.Object@4554617c//內存不夠用時try{//配置Xms和Xmx為5MBbyte[] bytes = new byte[1024102430];//設置30MB超內存}catch (Throwable e){e.printStackTrace();}finally {System.out.println(a);//nullSystem.out.println(softReference.get());//null}}
}

第一步

第二步撤了對a對象的強引用只剩軟引用了,手動喚醒gc對象被清除了

3.弱引用

弱引用(Weak Reference)是Java中一種比強引用更弱的引用類型。當一個對象只被弱引用關聯時,在下一次垃圾回收時,該對象就有可能被回收。垃圾回收器會在適當的時候回收僅被弱引用持有的對象,即使內存并不緊張。

public class WeakReferenceDemo {public static void main(String[] args) {// 創建一個對象并建立弱引用Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);// 對象仍然存在,可以正常使用System.out.println("Object is still accessible: " + weakRef.get());// 解除對對象的強引用obj = null;// 手動觸發垃圾回收System.gc();// 垃圾回收后,對象被回收,弱引用返回nullSystem.out.println("Object after garbage collection: " + weakRef.get());}}

  • 軟引用和弱引用一般都可以被用于實現內存敏感的緩存
  • ThreadLocalMap中的entry實體就是一個弱引用
static class ThreadLocalMap {// Entry是一個弱引用static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}
}

為什么要在ThreadLocal中使用弱引用?

先簡單說一下在?ThreadLocal?的實現中,它使用了一個名為?ThreadLocalMap?的哈希表來存儲每個線程的局部變量。這個?ThreadLocalMap?的鍵(Key)是?ThreadLocal?對象的弱引用,而值(Value)則是與線程相關聯的實際對象。

1.防止內存泄露:使用弱引用允許 JVM 在內存緊張時回收?ThreadLocal?對象,而不必等待整個ThreadLocalMap?被顯式清理。這種靈活性有助于更好地管理內存,特別是在高負載或長時間運行的應用程序中。

2.靈活的內存管理:使用弱引用允許 JVM 在內存緊張時回收?ThreadLocal?對象,而不必等待整個?ThreadLocalMap?被顯式清理。這種靈活性有助于更好地管理內存,特別是在高負載或長時間運行的應用程序中。

4.虛引用

虛引用(Phantom Reference)是Java中最弱的引用類型之一,無法通過引用直接獲取到對象實例。虛引用主要用于跟蹤對象被垃圾回收的狀態。當一個對象只被虛引用關聯時,其實際上并不影響對象的生命周期,也就是說,垃圾回收器隨時可能回收被虛引用關聯的對象,我們甚至無法通過get方法獲取到對象實例。

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

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

相關文章

防火墻的冗余基礎知識+實驗檢測

將之前先理清需要注意的知識點&#xff1a; 1、注意防火墻冗余時的會話表必須保持一致&#xff0c;這里HRP技術已經做到 2、vrrp是自動開啟搶占的&#xff0c;且是根據優先級進行搶占的 3、免費ARP的作用&#xff1a;告訴交換機的某個IP的mac地址變成了我的這個mac地址 4、HRP …

C++ | Leetcode C++題解之第231題2的冪

題目&#xff1a; 題解&#xff1a; class Solution { private:static constexpr int BIG 1 << 30;public:bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0;} };

強化學習——多臂老虎機問題(MAB)【附python代碼】

文章目錄 一、問題描述1.1 問題定義1.2 形式化描述1.3 累積懊悔1.4 估計期望獎勵 二、解決方法2.1 ?-貪婪算法2.2 上置信界算法2.3 湯普森采樣算法2.4 小結 一、問題描述 1.1 問題定義 有一個用于 K 根拉桿的老虎機&#xff0c;每一根拉桿都對應一個關于獎勵的概率分布 R 。每…

【C++題解】1154. 數組元素的查找

問題&#xff1a;1154. 數組元素的查找 類型&#xff1a;數組找數 題目描述&#xff1a; 給你 m 個整數&#xff0c;查找其中有無值為 n 的數&#xff0c;有則輸出該數第一次出現的位置,沒有則輸出 ?1 。 輸入&#xff1a; 第一行一個整數 m 代表數的個數 ( 0≤m≤100 ) 。…

Qt基礎 | Qt全局定義 | qglobal頭文件中的數據類型、函數、宏定義

文章目錄 一、數據類型定義二、函數三、宏定義 QtGlobal頭文件包含了 Qt 類庫的一些全局定義 &#xff0c;包括基本數據類型、函數和宏&#xff0c;一般的Qt類的頭文件都會包含該文件。 詳細內容可參考&#xff1a;https://doc.qt.io/qt-5/qtglobal.html 一、數據類型定義 為了…

數據可視化在智慧醫療中的重要應用

在現代智慧醫療的推動下&#xff0c;數據可視化技術正日益成為醫療領域的重要工具。通過將復雜的醫療數據轉換為直觀的圖表和圖形&#xff0c;數據可視化不僅提升了醫療服務的效率&#xff0c;還極大地改善了患者的就醫體驗。 在智慧醫療中&#xff0c;數據可視化首先在電子病歷…

客流統計系統優化景區服務流程,增強游客滿意度

在當今旅游業蓬勃發展的時代&#xff0c;景區面臨著越來越多的挑戰和機遇。如何提供更優質、更高效的服務&#xff0c;滿足游客日益增長的需求&#xff0c;成為了景區管理者們關注的焦點。客流統計系統作為一種創新的技術手段&#xff0c;正逐漸成為優化景區服務流程、增強游客…

MySQL主從同步的原理與思考

摘要 分析主從同步出現的原因&#xff0c;MySQL實現主從同步的原理&#xff0c;思考實現原理的局限性和優點 背景 在實際應用中主從同步常用于實現備份、負載均衡和高可用。數據冗余的目的是提高數據的安全性&#xff0c;避免因磁盤損壞導致數據丟失的問題。讀寫分離的目的是…

ubuntu系統Docker常用命令

1.查看docker是否開機啟動 sudo systemctl list-unit-files | grep enable|grep docker 2.設置開機啟動 sudo systemctl enable docker 3.關閉docker開機啟動 sudo systemctl disable docker 4.開啟docker服務 sudo service docker start 5.關閉docker服務 sudo servi…

基于CNN的MINIST手寫數字識別項目代碼以及原理詳解

文章目錄 項目簡介項目下載地址項目開發軟件環境項目開發硬件環境前言一、數據加載的作用二、Pytorch進行數據加載所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加載項目需要使用的庫 三、加載MINIST數據集3.1 數據集簡介3.2 數據預處理3.3 加載數據集 四…

2.10、matlab中字符、數字、矩陣、字符串和元胞合并為字符串并將字符串以不同格式寫入讀出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的數據類型&#xff08;字符、數字、矩陣、字符串和元胞&#xff09;合并為字符串&#xff0c;然后將字符串以不同格式寫入 Excel 文件。 以下是一個示例代碼&#xff0c;展示如何將不同數據類型合并為字符串&#xff0c;并以不…

重生奇跡mu魔法師瞬間移動技能

瞬間移動是勇士大陸魔法師所擁有的一項技能。一開始&#xff0c;許多玩家對這種技能的用處感到困惑。實際上&#xff0c;這種技能只能在游戲中不同的位置間進行移動&#xff0c;不能隨機傳送到地圖的其他坐標位置。 一位重生奇跡mu魔法師在PK中不小心使用了一項技能&#xff0c…

【仿真建模-anylogic】數據源組件

Author&#xff1a;趙志乾 Date&#xff1a;2024-07-16 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 簡介 仿真模型依賴的數據源通常有Excel文件、MySQL數據庫兩種&#xff1b;針對小數量、大數據量以及是否允許外部依賴等場景設計了一…

labview使用斑馬打印機打印標簽

使用ZebraDesigner 3設計標簽樣式 設計完成后打印至文件&#xff0c;生成prn文件 用記事本打開prn文件 ^MMT 標簽撕下 ^MMP 標簽剝離 按照需求替換FD--------^FS中間內容

路由上傳一個ui_control參數(uint32類型)控制頁面UI顯隱

前言&#xff1a;傳一個uint32類型的值&#xff0c;通過 按位或操作符&#xff08;|&#xff09;來設置ui_control的值&#xff0c;通過按位與操作符&#xff08;&&#xff09;來檢測是否顯示或隱藏 簡單介紹一下兩個概念&#xff1a; 按位與操作符和按位或操作符都是二進…

etcd的備份與恢復

一 為什么使用etcd 與ZooKeeper相比&#xff0c;etcd更簡單&#xff0c;安裝、部署和使用更加容易&#xff0c;并且etcd的某些功能是ZooKeeper所沒有的。因此&#xff0c;在很多場景下&#xff0c;etcd 比ZooKeeper更受用戶的青&#xff0c;具體表現在如下幾個方面: 1 etcd更…

上海市計算機學會競賽平臺2022年10月月賽丙組門禁記錄

題目描述 小愛得到了某大樓一天內按時間順序記錄的&#x1d45b;n條門禁出入記錄&#xff0c;每條記錄由兩個字符串組成&#xff0c;第一個字符串為出入人員姓名&#xff0c;第二個字符串表示該人員進出狀態、為 enter 或 exit 中一項&#xff0c;其中 enter 為進入&#xff0…

鑫創SSS1700USB音頻橋芯片USB轉IIS芯片

鑫創SSS1700支持IIC初始外部編&#xff08;EEPROM選項),兩線串行總線&#xff08;I2C總線&#xff09;用于外部MCU控制整個EEPROM空間可以通過MCU訪問用于主機控制同步的USB HID外部串行EEPROM&#xff08;24C02~24C16&#xff09;接口&#xff0c;用于客戶特定的USB視頻、PID、…

jmeter之變量隨機參數化以及解決多線程不會隨機變化

參考鏈接&#xff1a; https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函數多線程運行時數據不會隨機變化&#xff1f;_jmeter 線程組循環執行時 變量不變-CSDN博客 1、如下圖所示&#xff0c;需要對請求參數 autor 和phone進行隨機參數化 2、目前有…

MyBatis源碼中的設計模式2

組合模式的應用 組合模式介紹 組合模式(Composite Pattern) 的定義是&#xff1a;將對象組合成樹形結構以表示整體和部分的層次結構。組合模式可以讓用戶統一對待單個對象和對象的組合。 比如&#xff1a;Windows操作系統中的目錄結構&#xff0c;通過tree命令實現樹形結構展…