java基礎篇之GC
阿新 • • 發佈:2018-12-18
概述
java和C++有著一堵 記憶體動態分配 和 垃圾收集技術 圍成的“高牆”,外面的人想進去,裡面的人想出來。
java垃圾回收
GC(Garbage Collection) 的歷史比java還要久遠,1960年誕生的Lisp語言當時就在考慮三個問題:
- 哪些記憶體需要回收
- 什麼時候回收
- 如何回收
- 對於java來說,包括程式計數器,棧記憶體 ,他們隨執行緒生,隨執行緒滅,方法結束後記憶體也就回收了(記憶體洩漏後面在討論);
- 堆記憶體就不同了,一個介面的多個實現類可能需要的記憶體不同,一個方法的多個分支需要的記憶體也可能有區別,我們只有在程式執行的時候才知道建立了哪些物件,這部分的記憶體分配和回收都是動態的。所以堆是我們主要分析的區域。 下面來回答上面的三個問題
- 哪些記憶體需要回收 已經“死掉”的物件,需要回收,所以垃圾收集器的第一件工作就是區分哪些物件還在存活。一般有兩種策略 ①引用計數演算法, 給物件中新增一個引用計數器,每當有一個地方引用它時,計數器值就加1;當引用失效時,計數器值就減1;任何時刻計數器為0的物件就是不可能再被使用的。該方法實現簡單,效率高,但是它很難它很難解決物件之間相互迴圈引用的問題。所以,大多數jvm判斷物件是否存活基本並沒有採取該方法。 ②可達性分析演算法