java虛擬機器 垃圾收集演算法

2021-08-02 03:36:36 字數 1265 閱讀 7989

(標記:就是標記無用的物件.)

正如名字一樣,先標記再清除

但是有不足:
1.效率不行,標記和清除都慢
2.清除之後有太多的記憶體碎片

如下圖:

* 將記憶體(就是指堆)分為兩半,每次只用一半,當這一半滿了,就把還存活的物件複製到另外一半去,在清除已使用的那半,**記憶體.
* 但是相當於記憶體小了一半,不爽,得改!
* 經研究發現,98%的物件都是朝生夕死.所有沒必要劃一半,於是乎就有了eden空間和survivor空間(在堆中的新生代中).比例是8:1:1,一塊大的eden空間,一塊from survivor空間,一塊to survivor空間.(from和to只是相對的概念)
* 先用eden空間和一塊survivor空間,當這兩個空間用完了時,就把還活著的複製到另一塊survivor中.再清除.當這塊survivor不夠用時,就會分配到老年代中
如下圖;

(整理:將存活的物件向一端移動)

就是先標記再整理再清理,

標記後,先讓存活的物件向一端移動,然後直接清理掉 端 邊界以外的記憶體
為什麼要存在這樣的演算法呢?標記-清除演算法弊端太多,不好用.複製演算法有極端.
如果堆中的物件是100%的存活這種極端情況(老年代中基本就是這樣的).用複製演算法顯然不好.於是出現這種,主要解決了記憶體碎片的問題.
如下圖:

也不是什麼的新的演算法,就是根據各個代的特點採用適當的收集演算法.
在老年代使用標記-整理演算法
在新生代使用複製演算法

Java虛擬機器學習 垃圾收集演算法

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。下圖中,物件object6 object7 object8雖然互相引用,但他...

Java虛擬機器學習 垃圾收集演算法

跟蹤收集器採用的為集中式的管理方式,全域性記錄物件之間的引用狀態,執行時從一些列gc roots的物件做為起點,從這些節點向下開始進行搜尋所有的引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。下圖中,物件object6 object7 object8雖然互相引用,但他...

Java虛擬機器學習 垃圾收集演算法

跟蹤收集器採用的是集中式的管理方式,全域性記錄物件直接的引用狀態,執行時從一些gc roots的物件做為起點,從這些節點向下開始進行搜尋所有引用鏈,當乙個物件到gc roots 沒有任何引用鏈時,則證明此物件是不可用的。可以作為 gc roots 的物件包括 主要有標記清除 複製 標記 整理三種實現...