(三)jvm 物件生存還是死亡

2022-05-06 08:24:09 字數 1192 閱讀 2329

在jvm中如何判斷物件是生存還是死亡?

如何判斷物件已死?

引用型別

不管是使用「引用計數法」還是「可達性分析演算法」來判斷物件是否存活都和「引用相關」。在一種應用場景中:有一類物件,當記憶體空間足夠時,則保留在記憶體中,記憶體空間經過垃圾**後記憶體還是不夠則不是強引用的物件則可以進行拋棄,比如 很多系統的快取功能就符合這種應用場景。

引用型別

強引用(strong reference):**中普遍存在的,類似於new的物件,只要強引用還存在,垃圾**器永遠不會收掉被引用的物件。

軟引用(soft reference):用於還有用,但是並非必須的物件。會在系統將發生記憶體溢位異常之前,將對這些引用進行第二次**,如果**之後系統記憶體還是不夠用,則丟擲記憶體溢位異常,jdk使用softreference來實現

弱引用(weak reference):也用於描述非必須引用,但它的強度比軟引用更弱一點,被弱引用關聯的物件只能生存到下一次垃圾**之前,不管當前系統記憶體是否夠用都會被**。使用weakreference

虛引用(phantom reference):它是最弱的一種引用 ,虛引用的存在,完全不會對其生存時間構成影響,無法通過虛引用獲得物件的例項,其存在的目的就是能夠在這個物件被蒐集器**時收到乙個系統通知。使用phantomreference實現

注:四種引用的強度依次減弱

宣布物件死亡

要真正宣判乙個物件死亡要經歷兩次標記過程

物件經歷可達性分析後沒有與gc roots相連線的引用鏈,則進行一次標記和篩選。(篩選的條件是此物件是否有必要執行finalize方法。當物件沒有覆蓋finalize方法或該方法已被虛擬機器執行過則沒必要進行finalize方法)

在1篩選中,物件被判斷為有必要執行finalize方法,則將物件放入f-queue 佇列中,並在稍後由虛擬機器自動建立的,低優先順序的finalizer執行緒去執行物件的finalize()方法。這裡是「執行該方法」,虛擬機器並不保證該方法執行結束。稍後虛擬機器對f-queue進行第二次標記,物件唯一能逃脫被**這種命運的辦法是在執行finalize方法時和任意乙個引用鏈上的物件關聯即可,這時在進行第二次標記時會將物件重「即將**的集合」中移除,物件獲得新生。

注 需要注意的是finalize方法在物件的生命週期中最多執行一次,通過這種方式拯救物件是不可取的。

物件生存週期

假設有乙個cgoods類 1 cgoods s1 huotui 1 用 huotui 構造乙個臨時物件 2 用該臨時物件拷貝構造s1 3 析構該臨時物件 以上三步可以優化為 用 huotui 直接構造s1 2 s1 rou 1 用 rou 構造乙個臨時物件 2 用該臨時物件給s1賦值 3 析構該臨時...

C 中物件生存週期

在c 中,我們所使用的的物件都有嚴格的生存週期。所謂的物件生存週期是指物件從建立開始到被釋放為止的時間。對於靜態記憶體中儲存的區域性static物件 類static資料成員以及定義在任何函式之外的變數,全域性物件 任何函式之外的物件 在程式啟動時分配,在程式結束時銷毀 對於區域性static物件 類...

物件生存週期和系統優化

返回值與臨時量 if 0 返回值規則 1.類型別 都是以臨時量帶回及原因 2.其他型別 位元組數 4 由eax暫存器帶回 4 8 由eax 和edx 暫存器帶回 8 由臨時量帶回 class test test const test rhs ma 20 const test const int ge...