菜鳥學習JVM——垃圾回收演算法
阿新 • • 發佈:2018-10-31
Java垃圾回收演算法
所有的垃圾回收演算法都是為了解決三個問題:
- 哪些記憶體需要回收
- 什麼時候回收
- 怎麼回收
引用計數法(Reference Counting)
引用計數法原理很簡單,給每個物件分配一個計數器,當被引用時就加一,引用失效就減一。計數器為零時,則說明該物件不可能再被使用。引用計數法效率不錯,大部分情況下是個不錯的演算法,但它有一個非常明顯的缺點,就是無法回收互相引用的物件,從而引起記憶體洩露。這也是主流Java虛擬機器沒有選擇它的一個重要因素。
複製演算法(Copying)
複製演算法基於標記-清除演算法並對其產生過多記憶體碎片的缺點進行了優化。複製演算法將記憶體空間分成兩等份(如下圖的A和B),每次只使用其中的一塊,當垃圾回收的時候,將A中的可達物件複製到B中,然後清空A中的所有物件。這樣就避免了產生記憶體碎片的情況,但這種演算法的缺點也是顯而易見的,那就是太浪費空間。
總結(Summary)
JVM中採用的並不是某一種回收演算法,而是多種演算法組合使用,因為任何一種演算法都不是完美的,都有自身的優缺點,有自己適用的場景。需要把他們放到合適的地方,這樣才能各盡其能,達到一個最好的效果。