java引用相關(四大引用類型,軟引用避免oom,弱引用表,虛引用和引用隊列,可達性分析算法)

1. 什么是引用?

問題:什么是引用?Java中的引用是如何工作的?

答案

  • 引用 是對象的句柄,用于訪問堆內存中的對象。
  • 在Java中,引用變量實際上存儲的是對象的地址,而不是對象本身。
  • 通過引用,可以訪問對象的屬性和方法。

2. Java中的引用類型有哪些?

問題:Java中有哪幾種引用類型?

答案

  • 強引用(Strong Reference):最常見的引用類型,如 Object obj = new Object()。只要強引用存在,垃圾回收器就不會回收被引用的對象。
  • 軟引用(Soft Reference):通過 SoftReference 類實現。在內存不足時,垃圾回收器會回收軟引用指向的對象。
  • 弱引用(Weak Reference):通過 WeakReference 類實現。垃圾回收器在每次垃圾回收時都會回收弱引用指向的對象。
  • 虛引用(Phantom Reference):通過 PhantomReference 類實現。虛引用不會影響對象的生命周期,主要用于在對象被垃圾回收時收到通知。

3. 強引用和軟引用有什么區別?

問題:強引用和軟引用有什么區別?

答案

  • 強引用:只要強引用存在,垃圾回收器就不會回收被引用的對象。即使內存不足,也不會回收強引用的對象,可能會導致 OutOfMemoryError
  • 軟引用:在內存不足時,垃圾回收器會回收軟引用指向的對象。軟引用通常用于實現內存敏感的緩存。

4. 什么是弱引用?它的應用場景是什么?

問題:什么是弱引用?它的應用場景是什么?

答案

  • 弱引用:通過 WeakReference 類實現。垃圾回收器在每次垃圾回收時都會回收弱引用指向的對象。
  • 應用場景
    • 緩存:用于實現內存敏感的緩存,當內存不足時,可以自動釋放緩存對象。
    • 監聽器:在事件處理中,為了避免內存泄漏,可以使用弱引用來存儲監聽器。

5. 什么是虛引用?它的應用場景是什么?

問題:什么是虛引用?它的應用場景是什么?

答案

  • 虛引用:通過 PhantomReference 類實現。虛引用不會影響對象的生命周期,主要用于在對象被垃圾回收時收到通知。
  • 應用場景
    • 資源清理:在對象被垃圾回收時,執行一些資源清理工作,如關閉文件句柄、釋放資源等。

6. 如何判斷一個對象是否被垃圾回收了?

問題:如何判斷一個對象是否被垃圾回收了?

答案

  • 可以使用 PhantomReference 來判斷對象是否被垃圾回收。當對象被垃圾回收時,PhantomReferenceget 方法會返回 null
  • 可以將 PhantomReference 添加到 ReferenceQueue 中,當對象被垃圾回收時,ReferenceQueue 會收到通知。

7. 引用傳遞是按值傳遞還是按引用傳遞?

問題:Java中的引用傳遞是按值傳遞還是按引用傳遞?

答案

  • 按值傳遞:Java中的參數傳遞是按值傳遞的。對于基本類型,傳遞的是值的副本;對于引用類型,傳遞的是引用的副本。
  • 按引用傳遞的副本:傳遞的是對象引用的副本,而不是對象本身。因此,可以通過引用修改對象的狀態,但不能改變引用本身。

8. 如何避免內存泄漏?

問題:如何避免內存泄漏?

答案

  • 及時釋放引用:不再使用的對象要及時釋放引用,避免長時間持有無用對象的引用。
  • 使用弱引用:在緩存和監聽器等場景中,使用弱引用來避免內存泄漏。
  • 靜態變量謹慎使用:靜態變量的生命周期與類相同,容易導致內存泄漏。
  • 關閉資源:及時關閉文件句柄、數據庫連接等資源,避免資源泄漏。

9. 什么是引用計數法?Java的垃圾回收器是否使用引用計數法?

問題:什么是引用計數法?Java的垃圾回收器是否使用引用計數法?

答案

  • 引用計數法:每個對象都有一個引用計數器,每當有一個地方引用它時,計數器加1;當引用失效時,計數器減1。當計數器為0時,對象可以被回收。
  • Java的垃圾回收器:Java的垃圾回收器不使用引用計數法,而是使用可達性分析算法(Reachability Analysis)。通過從根節點(如棧幀中的局部變量表、方法區中的類靜態屬性)出發,遍歷所有可達對象,未被遍歷到的對象被視為垃圾,可以被回收。

10. 什么是可達性分析算法?

問題:什么是可達性分析算法?

答案

  • 可達性分析算法:從一系列稱為“GC Roots”的對象開始,向下搜索,走過的路徑稱為引用鏈。當一個對象到GC Roots沒有任何引用鏈相連時,證明此對象是不可達的,可以被垃圾回收。
  • GC Roots:包括棧幀中的局部變量表、方法區中的類靜態屬性、本地方法棧中的JNI引用等。

11. 什么是弱引用表?它在垃圾回收中的作用是什么?

問題:什么是弱引用表?它在垃圾回收中的作用是什么?

答案

  • 弱引用表:垃圾回收器在進行垃圾回收時,會維護一個弱引用表,記錄所有弱引用的對象。
  • 作用:在垃圾回收過程中,垃圾回收器會檢查弱引用表中的對象,如果這些對象沒有其他強引用,就會被回收。弱引用表主要用于實現內存敏感的緩存和資源管理。

12. 如何使用 WeakHashMap

問題:如何使用 WeakHashMap

答案

  • WeakHashMap:是一個基于弱引用的哈希表,鍵是弱引用,值可以是任意引用類型。
  • 使用場景:適用于實現內存敏感的緩存,當鍵對象被垃圾回收時,對應的條目也會被移除。
  • 示例代碼
    import java.util.WeakHashMap;public class WeakHashMapExample {public static void main(String[] args) {WeakHashMap<String, String> map = new WeakHashMap<>();String key = new String("key");map.put(key, "value");System.out.println(map.get(key)); // 輸出 "value"key = null;System.gc(); // 請求垃圾回收// 垃圾回收后,鍵對象被回收,對應的條目也被移除System.out.println(map.get("key")); // 輸出 null}
    }
    

13. 什么是引用隊列?如何使用?

問題:什么是引用隊列?如何使用?

答案

  • 引用隊列ReferenceQueue 是一個隊列,用于接收被垃圾回收器回收的引用對象。
  • 使用場景:通常與 PhantomReference 一起使用,用于在對象被垃圾回收時收到通知。
  • 示例代碼
    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;public class PhantomReferenceExample {public static void main(String[] args) {Object obj = new Object();ReferenceQueue<Object> queue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);obj = null;System.gc(); // 請求垃圾回收// 檢查引用隊列PhantomReference<?> ref = (PhantomReference<?>) queue.poll();if (ref != null) {System.out.println("對象已被垃圾回收");}}
    }
    

14. 什么是引用逃逸?如何避免?

問題:什么是引用逃逸?如何避免?

答案

  • 引用逃逸:在對象構造過程中,對象的引用被外部訪問,導致對象在未完全構造完成的情況下被使用。
  • 避免方法
    • 私有化構造函數:將構造函數設為私有,通過工廠方法創建對象。
    • 避免在構造函數中傳遞引用:不要在構造函數中將對象的引用傳遞給外部方法。
    • 使用 final 修飾符:將對象的屬性設為 final,確保對象的不可變性。

15. 什么是引用透明性?Java中的引用是否透明?

問題:什么是引用透明性?Java中的引用是否透明?

答案

  • 引用透明性:在一個表達式中,如果可以用一個值替換另一個值而不改變程序的行為,那么這個表達式就是引用透明的。
  • Java中的引用:Java中的引用不是完全透明的,因為引用的賦值和傳遞可能會改變對象的狀態。但是,對于不可變對象(如 String),引用是透明的。

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

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

相關文章

十一、容器化 vs 虛擬化-Docker

文章目錄 前言一、Docker 介紹1. 簡介2. 應用場景3. 特點4. Docker和虛擬機之間的區別5. 解決痛點1. 解決依賴兼容2. 解決操作系統環境差異3. 小結 二、Docker 架構三、工作流程五、Docker 核心組件及其工作機制1. Docker 客戶端&#xff08;Docker Client&#xff09;2. Docke…

linux學習筆記01 基礎命令

目錄 創建 touch 創建文件 &#xff08;創建但是不打開&#xff09; vi / vim 創建文件 (創建一個文件并打開) mkdir 創建文件夾 切換目錄 cd 查看 pwd 查看當前目錄完整路徑 ls 查看目錄信息 dir 查看目錄信息 ll 表示查看目標目錄下的信息 ls -a 查看當前目錄下的…

【深度學習】深刻理解多模態模型CLIP

CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09; 是由 OpenAI 提出的一個多模態模型&#xff0c;旨在學習視覺和語言的聯合表示&#xff0c;能夠通過圖像和文本之間的對比學習來實現圖像和文本之間的緊密聯系。CLIP 模型可以通過自然語言描述理解和處理圖…

android 聊天界面鍵盤、表情切換絲滑

1、我們在聊天頁面時候&#xff0c;往往會遇到&#xff0c;鍵盤、表情、其他選擇切換時候頁面會出現掉下來再彈起問題&#xff0c;這是因為&#xff0c;我們切換時候&#xff0c;鍵盤異步導致內容View高度變化&#xff0c;頁面掉下來后&#xff0c;又被其他內容頂起這種很差視覺…

Nginx 緩存系統 proxy_cache詳解

系列文章目錄 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目…

mysql時間戳格式化yyyy-mm-dd

格式化到 年月日 # 將時間換成列名就行&#xff1b;當前是秒級時間戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多語言翻譯,批量處理,學術論文,雙語對照(WIN/MAC)

分享一個非常實用的PDF文檔翻譯項目——PDFMathTranslate。作為一個經常逛GitHub的開發者&#xff0c;我總喜歡翻看各種項目附帶的論文&#xff0c;雖然大多時候是瞎研究&#xff0c;但卻樂在其中。該項目能夠完美保留公式、圖表、目錄和注釋&#xff0c;對于需要閱讀外文文獻的…

網絡藥理學:(待更)Alphafold3和批量分子動力學模擬(Desmond、AutoMD)

批量動力學模擬 注意全都需要在類linux平臺上進行 安裝Desmond模塊&#xff1a; https://github.com/Wang-Lin-boop/Schrodinger-Script 安裝AutoMD模塊&#xff1a; Wang-Lin-boop/CADD-Scripts: Scripts for virtual screening, cross docking and protein relax using Sc…

爬蟲基礎之代理的基本原理

在做爬蟲的過程中經常會遇到一種情況&#xff0c;就是爬蟲最初是正常運行、正常抓取數據的&#xff0c;一切看起來都是那么美好&#xff0c;然而一杯茶的工夫就出現了錯誤&#xff0c;例如 403 Forbidden&#xff0c;這時打開網頁一看&#xff0c;可能會看到“您的IP訪問頻率太…

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③

第十七屆山東省職業院校技能大賽 中職組“網絡安全”賽項資源任務書樣題③ 模塊A 基礎設施設置與安全加固(200分)A-1 登錄安全加固&#xff08;Windows, Linux&#xff09;A-2 Nginx安全策略&#xff08;Linux&#xff09;A-3日志監控&#xff08;Windows&#xff09;A-4中間件…

鯤鵬麒麟安裝Kafka-v1.1.1

因項目需要在鯤鵬麒麟服務器上安裝Kafka v1.1.1&#xff0c;因此這里將安裝配置過程記錄下來。 環境說明 # 查看系統相關詳細信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系統服務端開發模式-應用開發-登錄退出發送郵件

一、登錄成功發送郵件 在根目錄下app文件夾下controller文件夾下common文件夾下&#xff0c;修改Login.php&#xff0c;代碼如下 <?php /*** 登錄退出操作* User: 龍哥三年風水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戲開發] Unity中使用FlatBuffer

什么是FlatBuffer 官網&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 為什么用FloatBuffer&#xff0c…

MySQL其一,概念學習,可視化軟件安裝以及增刪改查語句

目錄 MySQL 1、數據庫的概念 2、數據庫分類 3、MySQL的安裝 4、安裝過程中的問題 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、編寫SQL語句 6、DDL語句 7、DML 新增數據&#xff1a; 刪除數據&#xff1a; 修改數據&#xff1a; MySQL SQL其實是一門…

05 在 Linux 使用 AXI DMA

DMA簡介 DMA 是一種采用硬件實現存儲器與存儲器之間或存儲器與外設之間直接進行高速數據傳輸的技術&#xff0c;傳輸過程無需 CPU 參與&#xff08;但是CPU需要提前配置傳輸規則&#xff09;&#xff0c;可以大大減輕 CPU 的負擔。 DMA 存儲傳輸的過程如下&#xff1a; CPU 向…

linux 安裝 vsftpd 服務以及配置全攻略,vsftpd 虛擬多用戶多目錄配置,為每個用戶配置不同的使用權限

linux 安裝 vsftpd 服務以及配置全攻略&#xff0c;vsftpd 虛擬多用戶多目錄配置&#xff0c;為每個用戶配置不同的使用權限。 linux 安裝 vsftpd 服務以及配置全攻略 FTP 是 File Transfer Protocol 的簡稱&#xff0c;用于 Internet 上的控制文件的雙向傳輸。同時&#xff0…

SQL語句在MySQL中如何執行

MySQL的基礎架構 首先就是客戶端&#xff0c;其次Server服務層&#xff0c;大多數MySQL的核心服務都在這一層&#xff0c;包括連接、分析、優化、緩存以及所有的內置函數&#xff08;時間、日期、加密函數&#xff09;&#xff0c;所有跨存儲引擎功能都在這一層實現&#xff1…

ragflow連不上ollama的解決方案

由于前期wsl默認裝在C盤&#xff0c;后期部署好RagFlow后C盤爆紅&#xff0c;在連接ollama的時候一直在轉圈圈&#xff0c;問其他人沒有遇到這種情況&#xff0c;猜測是因為內存不足無法加載模型導致&#xff0c;今天重新在E盤安裝wsl 使用wsl裝Ubuntu Win11 wsl-安裝教程 如…

力扣-漢明距離

1.兩個整數之間的 漢明距離 指的是這兩個數字對應二進制位不同的位置的數目。 給你兩個整數 x 和 y&#xff0c;計算并返回它們之間的漢明距離。 看到這題&#xff0c;當然想到了按位異或^,并且c內置了計算二進制數中1數量的函數__builtin_popcount() class Solution { publ…

關于成功插入 SQLite 但沒有數據的問題

背景 技術棧&#xff1a;SpringBoot Mybatis-flex SQLite 項目中集成了SQLite&#xff0c;配置如下&#xff1a; spring:datasource:url: jdbc:sqlite::resource:db/project.dbdriver-class-name: org.sqlite.JDBC在進行測試時&#xff0c;使用Mybatis-flex往表中插入數據&…