深入理解虛擬機(3)垃圾蒐集策略與算法

程序計數器、虛擬機棧、本地方法棧隨線程而生,也隨線程而滅;棧幀隨着方法的開始而入棧,隨着方法的結束而出棧。這幾個區域的內存分配和回收都具有確定性,在這幾個區域內不需要過多考慮回收的問題,因爲方法結束或者線程結束時,內存自然就跟隨着回收了。

而對於 Java 堆和方法區,我們只有在程序運行期間才能知道會創建哪些對象,這部分內存的分配和回收都是動態的,垃圾收集器所關注的正是這部分內存。

判定對象是否存活
若一個對象不被任何對象或變量引用,那麼它就是無效對象,需要被回收。

在對象頭維護着一個 counter 計數器,對象被引用一次則計數器 +1;若引用失效則計數器 -1。當計數器爲 0 時,就認爲該對象無效了。

引用計數算法的實現簡單,判定效率也很高,在大部分情況下它都是一個不錯的算法。但是主流的 Java 虛擬機裏沒有選用引用計數算法來管理內存,主要是因爲它很難解決對象之間循環引用的問題。

舉個栗子

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