在JVM中 判定哪些對象是垃圾?

目錄

垃圾的條件

1、引用計數法

2、可達性分析

3、強引用

4、軟引用

5、弱引用

6、虛引用


判斷垃圾的條件

在Java虛擬機(JVM)中,垃圾收集器負責管理內存,其中的垃圾收集算法用于確定哪些對象是垃圾,可以被回收以釋放內存空間。Java中主要使用的是自動內存管理,垃圾收集器會自動識別和回收不再被程序引用的對象。以下是一些判定對象為垃圾的條件:

1、引用計數法

引用計數法是一種簡單而直觀的垃圾收集算法,其核心思想是通過在對象頭中添加一個引用計數器,記錄該對象被引用的次數。每當有一個新的引用指向該對象時,引用計數加一;當引用被刪除或者超出作用范圍時,引用計數減一。當引用計數為零時,表示該對象不再被引用,即可以被回收。

然而,引用計數法有一個明顯的缺陷,即難以處理循環引用的情況。例如,兩個對象互相引用,它們的引用計數永遠不會變為零,即使它們已經不再被程序所使用。

以下是一個簡單的引用計數法的Java代碼示例:

class ReferenceCountingObject {private int referenceCount = 0;public ReferenceCountingObject() {// 對象初始化時,引用計數為 0}public void addReference() {referenceCount++;}public void removeReference() {referenceCount--;if (referenceCount == 0) {// 當引用計數為零時,可以進行垃圾回收操作System.out.println("對象被回收");}}
}public class ReferenceCountingExample {public static void main(String[] args) {// 創建兩個對象ReferenceCountingObject obj1 = new ReferenceCountingObject();ReferenceCountingObject obj2 = new ReferenceCountingObject();// obj1 引用計數加一obj1.addReference();// obj2 引用計數加一obj2.addReference();// obj1 引用計數減一obj1.removeReference();// obj1 引用計數為零,可以進行垃圾回收// obj2 引用計數仍為一}
}

2、可達性分析

可達性分析是Java虛擬機中垃圾收集的核心算法之一,它主要通過判斷對象是否能夠從一組稱為"GC Roots"的根對象出發,通過引用鏈追蹤,最終判斷對象是否可達。以下是關于可達性分析的一些詳細細節和Java代碼示例:

  1. GC Roots: GC Roots包括虛擬機棧中引用的對象、方法區中類靜態屬性引用的對象、方法區中常量引用的對象以及本地方法棧中JNI(Java Native Interface)引用的對象。這些對象被認為是程序的根對象,是可達性分析的起始點。

  2. 可達性分析過程: 從GC Roots出發,通過對象引用鏈逐步追蹤,判斷對象是否能夠被程序訪問到。如果對象能夠通過一系列引用到達GC Roots,則該對象被認為是可達的;反之,如果無法到達,則被認為是不可達的。

  3. 標記-清除算法: 在可達性分析過程中,標記-清除算法是一種常用的垃圾收集算法。通過標記可達的對象,然后清除不可達的對象,最終回收被標記的垃圾。

下面是一個簡單的Java代碼示例,演示了可達性分析的基本原理:

class MyClass {// 成員變量,作為引用private MyClass reference;public MyClass() {this.reference = null;}public void setReference(MyClass anotherObject) {this.reference = anotherObject;}
}public class ReachabilityAnalysisExample {public static void main(String[] args) {// 創建對象1MyClass obj1 = new MyClass();// 創建對象2MyClass obj2 = new MyClass();// obj1 的 reference 成員變量指向 obj2obj1.setReference(obj2);// obj2 的 reference 成員變量為空,不指向其他對象// 現在,obj1 和 obj2 都是可達的,因為它們可以通過引用鏈相互訪問// 將 obj1 置為 null,切斷對 obj1 的引用obj1 = null;// 現在,obj1 不可達,因為沒有其他引用指向它,但 obj2 仍然可達// 執行垃圾回收System.gc();// 垃圾回收器可能會回收不可達的對象,釋放其占用的內存// 在實際應用中,Java 虛擬機會根據不同的垃圾收集算法和策略執行垃圾回收}
}

?

3、強引用

強引用是最常見的引用類型,只要強引用存在,垃圾收集器就不會回收被引用的對象。當沒有任何強引用指向一個對象時,該對象就變得不可達。

  • 特點: 強引用是最常見的引用類型,它會使對象始終保持存活。只要存在強引用指向一個對象,垃圾收集器就不會回收該對象。

  • 使用場景: 大多數對象的引用都是強引用,例如通過 new 操作符創建的對象就是強引用。當程序員希望確保對象不被垃圾收集器回收時,使用強引用是合適的。

Object obj = new Object(); // 強引用

?

4、軟引用

軟引用用于描述一些還有用但非必需的對象。在系統將要發生內存溢出之前,會嘗試回收軟引用指向的對象。

  • 特點: 軟引用用于描述一些還有用但非必需的對象。當系統內存不足時,垃圾收集器會根據軟引用的情況來決定是否回收該對象,以釋放內存。

  • 使用場景: 軟引用通常用于實現緩存策略,允許在內存不足時回收部分緩存而不會導致程序崩潰。

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

5、弱引用

弱引用也用于描述非必需對象,但它的生命周期比軟引用更短。當垃圾收集器運行時,無論內存是否足夠,都會回收被弱引用指向的對象。

  • 特點: 弱引用描述的是非必需對象,其生命周期比軟引用更短。當垃圾收集器運行時,無論內存是否足夠,都會回收被弱引用指向的對象。

  • 使用場景: 弱引用常用于實現對象緩存,但不希望緩存的對象影響垃圾回收。

WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get(); // 獲取弱引用指向的對象

6、虛引用

虛引用是最弱的引用類型,幾乎沒有保持對象存活的作用。主要用于對象被回收前的一些清理操作。

  • 特點: 虛引用是最弱的引用類型,幾乎沒有保持對象存活的作用。主要用于對象被回收前的一些清理操作。虛引用必須和引用隊列(ReferenceQueue)一起使用。

  • 使用場景: 虛引用主要用于跟蹤對象被垃圾收集的狀態,執行一些清理操作或者資源釋放。

ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// 虛引用不提供 get 方法,因為其并不保持對象的存活,需要通過 ReferenceQueue 來獲取通知
Object obj = phantomRef.get(); // 返回始終為 null

?總體而言,這些引用類型在Java中提供了更靈活的內存管理手段,允許開發人員根據不同的場景來控制對象的生命周期。選擇合適的引用類型取決于應用程序的需求,以及對內存使用和性能的權衡。

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

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

相關文章

VBA即用型代碼手冊之工作薄的關閉保存及創建

我給VBA下的定義&#xff1a;VBA是個人小型自動化處理的有效工具。可以大大提高自己的勞動效率&#xff0c;而且可以提高數據的準確性。我這里專注VBA,將我多年的經驗匯集在VBA系列九套教程中。 作為我的學員要利用我的積木編程思想&#xff0c;積木編程最重要的是積木如何搭建…

[Latex] Riemann 問題中的激波,接觸間斷,膨脹波的 Tikz 繪圖

Latex 代碼 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定義組件學習

文章目錄 創建自定義組件頁面和自定義組件生命周期自定義組件和頁面的區別頁面生命周期(即被Entry修飾的組件)組件生命周期(即被Component修飾的組件) Builder裝飾器&#xff1a;自定義構建函數按引用傳遞參數按值傳遞參數 BuilderParam裝飾器&#xff1a;引用Builder函數 這個…

Python 將列表拼接為一個字符串,Python join

目錄 join方法的源碼&#xff1a; 列表數據為字符串 列表數據為數字 三引號也可以使用join join方法的源碼&#xff1a; def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos應用開發者高級認證考試部分答案

1只要使用端云一體化的云端資源就需要支付費用&#xff08;錯&#xff09; 2所有使用Component修飾的自定義組件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函數。&#xff08;錯&#xff09; 3 HarmonyOS應用可以兼容OpenHarmony生態&#xff08;對&#…

一文讀懂如何安全地存儲密碼

目錄 引言 明文存儲 基本哈希存儲 加鹽哈希存儲 適應性哈希算法 密碼加密存儲 小結 引言 密碼是最常用的身份驗證手段&#xff0c;既簡單又高效。密碼安全是網絡安全的基石&#xff0c;對保護個人和組織信息的安全具有根本性的作用。然而有關密碼泄漏的安全問題一再發生…

生物動力葡萄酒和有機葡萄酒一樣嗎?

農業維持了數十萬年的文明&#xff0c;但當人類以錯誤的方式過多干預&#xff0c;過于專注于制造和操縱產品時&#xff0c;農業往往會失敗。如果我們的目標是獲得最高質量的收成&#xff0c;并長期堅持我們的做法&#xff0c;我們就必須與土地打交道。 當我們開始尋找生物動力…

應用內測分發平臺如何上傳應用包體?

●您可免費將您的應用&#xff08;支持蘋果.ios安卓.apk文件&#xff09;上傳至咕嚕分發平臺&#xff0c;我們將免費為應用生成下載信息&#xff0c;但咕嚕分發將會對應用的下載次數進行收費&#xff08;每個賬號都享有免費贈送的下載點數以及參加活動的贈送點數&#xff09;&a…

UVA1025 城市里的間諜 A Spy in the Metro

UVA1025 城市里的間諜 A Spy in the Metro 題面翻譯 題目大意 某城市地鐵是一條直線&#xff0c;有 n n n&#xff08; 2 ≤ n ≤ 50 2\leq n\leq 50 2≤n≤50&#xff09;個車站&#xff0c;從左到右編號 1 … n 1\ldots n 1…n。有 M 1 M_1 M1? 輛列車從第 1 1 1 站開…

【電路筆記】-分壓器

分壓器 文章目錄 分壓器1、概述2、負載分壓器3、分壓器網絡4、無功分壓器4.1 電容分壓器4.2 感應分壓器 5、總結 有時&#xff0c;需要精確的電壓值作為參考&#xff0c;或者僅在需要較少功率的電路的特定階段之前需要。 分壓器是解決此問題的一個簡單方法&#xff0c;因為它們…

【Vue】filter的用法

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

在vscode下將ipynb文件轉成pdf的方法

正常情況下&#xff0c;可以在vscode的ipynb界面點擊上面的三個點&#xff0c;里面有export&#xff0c;可以選擇直接輸出html和pdf&#xff0c;但是需要latex&#xff0c;由于按扎u安裝麻煩&#xff0c;所以我換了一種方法。 ----------------------------------------------…

記一次docker服務啟動失敗解決過程

環境&#xff1a;centos 7.6 報錯&#xff1a;start request repeated too quickly for docker.service 由于服務器修復了內核漏洞&#xff0c;需要重啟&#xff0c;沒想到重啟后&#xff0c;docker啟動失敗了 查看狀態 systemctl status docker如下圖 里面有一行提示&…

網絡互聯與IP地址

目錄 網絡互聯概述網絡的定義與分類網絡的定義網絡的分類 OSI模型和DoD模型網絡拓撲結構總線型拓撲結構星型拓撲結構環型拓撲結構 傳輸介質同軸電纜雙絞線光纖 介質訪問控制方式CSMA/CD令牌 網絡設備網卡集線器交換機路由器總結 IP地址A、B、C類IP地址特殊地址形式 子網與子網掩…

[NOIP2013 提高組] 積木大賽

Description 春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內容是搭建一座寬度為 n 的大廈&#xff0c;大廈可以看成由 n 塊寬度為 1 的積木組成&#xff0c;第 i 塊積木的最終高度需要是 hi?。 在搭建開始之前&#xff0c;沒有任何積木&#xff08;可以看成 n 塊高度…

使用rsync從OpenShift的pod復制文件

環境 Red Hat Enterprise Linux release 8.6 (Ootpa)OCP 4.12.22 準備 安裝rsync&#xff1a; yum install rsync 查看pod&#xff1a; [rootapi.kai1123.cp.fyre.ibm.com ~]# oc get pod -n cpd-instance | grep dmc ...... ibm-dmc-1700727413211000-monitor-0 …

DCDC電感發熱嘯叫原因分析

一、電感發熱嘯叫原因解析 發熱原因&#xff1a;電感飽和&#xff0c;實際使用的電感值<理論電感計算值 原因1&#xff1a;電感選擇過小&#xff0c;計算值不合理。 原因2&#xff1a;PCB布局不合理&#xff0c;屏蔽型電感下方應設禁止鋪銅區。 嘯叫原因&#xff1a; 人耳的…

Log4j2.xml不生效:WARN StatusLogger Multiple logging implementations found:

背景 將 -Dlog4j.debug 添加到IDEA的類的啟動配置中 運行上圖代碼&#xff0c;這里log4j2.xml控制的日志級別是info&#xff0c;很明顯是沒生效。 DEBUG StatusLogger org.slf4j.helpers.Log4jLoggerFactory is not on classpath. Good! DEBUG StatusLogger Using Shutdow…

小數化分數

【問題描述】 任何小數都能表示成分數的形式&#xff0c;對于給定的小數&#xff0c;編寫程序其化為最簡分數輸出&#xff0c;小數包括簡單小數和循環小數。 【輸入形式】 第一行是一個整數N&#xff0c;表示有多少組數據。 每組數據只有一個純小數&#xff0c;也就是整…

Camera Raw v16.0.0(PS Raw增效工具)

Camera Raw 16是一款允許攝影師處理原始圖像文件的軟件PS增效工具。原始圖像文件是未經相機內部軟件處理的數碼照片&#xff0c;因此包含相機傳感器捕獲的所有信息。Camera Raw 為攝影師提供了一種在將原始文件轉換為更廣泛兼容的格式&#xff08;如 JPEG 或 TIFF&#xff09;之…