gc運作流程和底層實現

  Garbage Collection簡稱爲GC,即垃圾回收。內存處理器是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰。Java語言提供的GC功能可以自動的檢測對象是否超過作用域,從而達到自動回收內存的目的,java語言沒有提供釋放已分配內存的顯示操作方法,資源回收工作全部交由GC來完成,程序員不能精確的控制垃圾回收的時機。

GC在實現垃圾回收時的基本原理:

    Java的內存管理實際就是對象的管理,其中包括對像的分配和釋放。對於程序員來說,分配對象使用new關鍵字,釋放對象時只是將對象賦值爲null,讓程序員不能夠再訪問到這個對象,該對象被稱爲“不可達”。GC將負責回收所有“不可達”對象的內存空間。

  對於GC來說,當程序員創建對象時,GC就開始監控這個對象地址、大小以及使用情況。通常GC採用有向圖的方式記錄並管理堆中的所有對象,通過這種方式確定哪些對象是“可達”的,哪些對象是“不可達”的。當GC確定一些對象爲“不可達時”GC就有責任回收這些內存空間,但爲了GC能夠在不同的平臺上實現,java規範對GC的很多行爲都沒有進行嚴格的規定。例如對於採用什麼類型的回收算法、什麼時候進行回收等重要問題都沒有明確的規定,因此不同的JVM實現着不同的的實現算法,這也給JAVA程序員的開發帶來了很多不確定性。

     根據GC的工作原理,可以通過一些技巧讓GC運行更加高效合理。如下:

1、儘早釋放無用對象的引用,特別注意一些複雜對象,如數組,隊列等。對於此類對象,GC回收它們的效率一般較低,如果程序允許,應儘早將不用的引用對象賦爲null,這樣可以加速GC的工作。

2、儘量少用finalize函數。finalize是java提供給程序員用來釋放對象或資源的函數,但是它會加大GC的工作量,因此儘量少採用finalize函數回收資源。 當程序有一定的等待時間,程序員可以手動執行System.gc(),通知GC運行,但是java語言規範並不保證GC一定會執行。

finalize是方法名,java技術允許使用finalize()方法在垃圾收集器從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象的調用的。它是在Object類定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統資源或者執行其他清理工作。finalize()方法是在垃圾收集器刪除對象之前對這個對象的調用的。

想要知道更多,推薦:JVM結構、GC工作機制詳解 - CSDN博客 https://blog.csdn.net/tonytfjing/article/details/44278233

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章