JVM GC簡介
阿新 • • 發佈:2018-12-11
GC垃圾回收
本章節主要針對於以下三個問題的兩個問題進行描述。
如何判定為垃圾物件?
-
引用計數法
在物件中新增一個引用計數器,當有地方引用這個物件的時候這個引用計數器的值就+1,當引用計數器失效的時候,計數器的值就-1。當引用計數器為0就判斷為垃圾物件。 圖解(靈魂畫手又重出江湖啦哈哈哈哈哈哈哈哈): 假設棧中有一個指向(直接引用或者控制代碼的方式)堆中的物件,如果我們把引用置為null,那麼引用計數器就會-1.當垃圾回收器發現引用計數器為0就會進行回收。 缺點:如果物件之間屬性相互引用,棧中就沒有引用指向它們,但是它們的引用計數器不為0,並不會回收這些物件。這種演算法現在基本不用。。
-
可達性分析 通過GC Root往下走,往下走的過程叫做引用鏈。當一個物件對GC Root節點沒有任何引用鏈連線的時候,這個物件就可以被回收了。 那,哪些物件可以作為GC Root嘞?
- 虛擬機器棧(棧幀中的本地變量表)中引用的物件
- 方法區中靜態屬性引用的物件
- 方法區中常量引用的物件
- 本地方法棧中引用的物件
如何回收?
- 回收的策略
標記清除演算法
用引用計數法或可達性分析法標記出來需要回收的物件,然後再進行清除
缺點:效率不高。記憶體空間不連續。如果有一個比較大的物件要分配記憶體就很有可能沒有連續的記憶體給它分配。
複製演算法
在熟悉複製演算法之前,先重新理一下堆。堆可以分為新生代
- 常見的垃圾回收器 (有空整理各自優缺點、演算法) Serial ParNew Parallel Scavenge CMS G1