物件的生命週期

2022-03-05 19:43:04 字數 851 閱讀 8063

全域性物件的引用(雖然在c#不允許,但是cil的確允許分配全域性物件)

靜態物件/靜態欄位的引用

應用程式的**庫的區域性物件的引用

傳遞進乙個方法的物件引數的引用

等待被終結的物件的引用

任何引用物件的cpu暫存器

要尋找不可達的物件,如果clr逐個檢查託管堆的沒乙個物件,很明顯,效率很低。

每個物件都會被指定為屬於某「代」,設計思路很簡單:物件在堆上存在的時間越長,它就更可能應該保留,而剛加的可能很快不可達。

有三種代:

第0代:從沒有被標記為**的新分配的物件。

第2代:在一次以上垃圾**中沒有被**的物件。

總結垃圾**過程如下:在記憶體不足的情況下,第一次gc,先搜尋第0代,刪除一些物件,而沒有被刪除的公升級為第1代;第二次gc,如果那些剛公升級為第1代的還不需要被刪除(即可達或者已經獲取足夠記憶體),那麼再次公升級為第2代。以此類推。記住準則為先搜尋第0代,逐代刪除不可達,並將沒有刪除的公升級。並且第2代無法繼續公升級,只能停留在第2代。也可理解為,盡快刪除一些新的物件,避免打擾舊的物件。

極少使用這個型別。只有在建立非託管資源的型別時,才需要在**中直接使用這個型別。

通過程式設計使用gc.collect()強制進行可能會有好處。說得更明確就是:

維護內部非託管資源的託管類的手段:finalize()--終結和dispose()--處置

非託管資源:原始的作業系統檔案控制代碼,原始的非託管資料庫連線,非託管記憶體或其他非託管資源。

finalize()特性:

dispose()特性:

個人總結:

相同點:

不同點:

兩個方式有優有劣,可有乙個好的解決方案來平衡兩個方法,下篇介紹。p209

java 物件的生命週期

物件的生命週期 1 區域性變數只會存活在該變數的方法中 life 只能在該方法內部使用 scope public void test 2 例項變數的壽命與物件相同。如果物件還活著,例項變數也是會活的 有三種方法可以釋放物件的引用 1 引用永久性的離開他的範圍 public void test a 會...

c 物件的生命週期

c 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點 是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。所謂構造式 constructor 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...

c 物件的生命週期

c 的new 運運算元和c 的malloc 函式都是為了配置記憶體,但前者比之後者的優點 是,new 不但配置物件所需的記憶體空間時,同時會引發構造式的執行。所謂構造式 constructor 就是物件誕生後第乙個執行 並且是自動執行 的函式,它 的函式名稱必定要與類別名稱相同。相對於構造式,自然就...