JVM 自動內存管理

本文主要整理自《深入理解Java虛擬機》,有不合理的地方可以直接參考書籍,寫這篇博客的目的主要是爲這一章做一個自我總結。

內存自動管理主要是回答三個問題?

1、哪些對象可以回收--回收判定算法:引用計數法和可達性分析。

2、什麼時候可以回收--回收位置:安全點和安全區。

3、怎麼進行回收--回收算法:標記-清楚算法、複製算法、標記整理。

一、回收判定算法:

1、引用計數法:引用計數法是對jvm管理的每一個對象設置一個引用值,引用值表示該對象在當前系統被引用的次數,當引用值爲0時,表示沒有被任何對象引用可以被回收。

引用計數法主要缺陷是無法解決循環引用問題導致內存泄漏,例如A.b = B && B.a = A, 但這兩個對象沒有在任何其他的位置被引用,按我們的視角這兩個對象已經是無用對象,應該被回收,但是他們的引用值一直不爲0, 因此無法回收。

2、可達性分析:通過一系列被稱爲"GC Roots"的對象作爲根節點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈,當一個節點沒有任何一條到達“GC Roots”的路徑時,證明此節點可以被回收。

算法的關鍵:什麼對象可以作爲“GC Roots”:

1)、虛擬機棧中(幀中的本地變量表)引用的對象。

2)、本地方法棧中引用的對象。

3)、方法區中靜態變量引用的對象。

4)、方法區中常量引用的對象。

二、回收位置:

在回收過程中,導致引用變化的指令非常多,所以在進行回收時,回收所處的位置應該是一個引用變化很少,程序執行時間相對較長的位置。

安全點:

 

 

 

 

 

 

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