###gc複製演算法
它是把某一空間的活動物件全部複製到另乙個空間,複製完成後gc也就結束了
一起看下gc複製演算法的copying函式:
copying
()
copy函式在複製時會先檢查是否已被複製,若已被複製,不再操作,否則進行複製,貼上copied標籤複製完成返回新空間的位址,這樣即使有多個物件引用obj,也不會被被多次複製
還有一點就是把指向新空間物件的指標放到obj.forwarding裡,這樣之後找到指向原空間物件的指標時,需要把找到的指標指向新的空間,forwarding指標就是為它準備的
要實現這個方法,必須滿足2個條件
1)每個物件至少有2個域,分別存貯copied標籤和forwarding指標
2)copied標籤為了挪用obj中的域,必須選乙個mutator絕不會用到的值
gc複製演算法的分配過程很簡單
new_obj
(size
)
複製的過程用的是深度優先搜尋
優點:1)優秀的吞吐量
gc標記-清除演算法消耗的吞吐量是搜尋活動物件(標記階段)和搜尋整體堆(清除階段)所花費的時間之和,gc複製只搜尋並複製活動物件,可在較短時間內完成gc,也就是吞吐量優秀
2)可實現高速分配
gc複製演算法不使用空閒鍊錶,因為分塊是乙個連續的空間,只要申請的空間小於分塊,就可以移到free指標進行分配了,使用空閒鍊錶時,不得不變數空閒鍊錶,找到符合要求的分塊,無疑浪費了大把的時間
3)不會產生碎片
把所有物件集中放在堆的一端的行為叫壓縮,gc複製時,每次都會進行壓縮,所以,不會產生碎片化
4)與快取相容
由於是深度優先搜尋,所以,有引用關係的物件會被防止距離較近的位置,這種情況下mutator就會執行比較快,這也是借助壓縮實現的優點
缺點:1)堆使用效率低,它把堆二等分,只能使用其中的一般來存放物件了
2)不相容保守式gc演算法
gc標記-清除法不用移動物件,所以可以和保守式gc相相容,gc複製演算法,必須移動物件,重寫指標,所以沒辦法相容,不過,可以組合使用
3)遞迴呼叫函式
複製某個物件時,要遞迴複製其子物件,所以每次進行複製的時候都要呼叫函式,由此帶來的負擔不容忽視,此外,每次遞迴呼叫都會消耗棧,所以,還有棧溢位的可能
#### cheney的gc演算法
和上邊的大致相同,但是省略了copied標籤,利用forwarding指標來標記是否複製完成,如果有指向to空間的指標,則複製完成,另外使用的是廣度優先搜尋(先複製所以從根引用的物件,再查詢對to空間的物件有引用的物件)
優點:cheney的gc是迭代,可以抑制呼叫函式的額外負擔和棧的消耗,特別是拿堆用作佇列,省去了搜尋的記憶體空間,這點是點睛之處
缺點:失去了深度優先搜尋時的快取利用的遍歷,有引用關係的物件並不相鄰
### 近似深度優先搜尋
先廣度搜尋,使有引用關係的物件在相同的頁出現,然後,進行深度優先搜尋,使得不管在哪個頁面,物件間都有引用關係
#### 多空間複製演算法
其實就是把堆n等分,對其中2塊進行gc複製,另外的空間進行gc標記-清除演算法
優點:將堆分割成更多的空間,有效的利用了堆,多空間的複製演算法僅需要空出乙個分塊,不能使用的只有1/n個堆
缺點:由於是gc複製演算法和標記-清除演算法的組合,標記清除演算法固有的缺點沒辦法避免,比如分配耗時,碎片化的產生
GC演算法 複製演算法
複製演算法就是將記憶體空間二等分,每次只使用其中一塊.當執行gc時,講a部分的所有活動物件集體移到b中,就可以講a全部釋放.畫個圖就是 在執行gc前,記憶體長這樣 當執行gc後,記憶體就變成這樣了 還記得標記清除演算法的問題是什麼嗎?記憶體碎片化嚴重.現在好了,碎片化問題解決了,每次gc執行後,記憶...
GC演算法 筆記 GC標記 壓縮演算法
將 gc標記 清除演算法與gc複製演算法相結合。一 lisp2演算法 標記階段結束後進入壓縮階段,壓縮階段縮小被標記節點之間的距離。compaction phase set forwarding ptr adjust ptr move obj 優點 可有效利用堆 缺點 壓縮花費計算成本 二 two ...
GC常用演算法
jvm在進行gc時,並不是對這三個區域統 一 大部分時候,都是新生代 新生代 倖存區 form,to 老年區 gc兩種類 輕gc 普通的gc 重gc 全域性gc 倖存區的from和to是動態變化的,誰空誰是to gc常用演算法 引用計數器演算法 原理 此物件有乙個引用,則 1 刪除乙個引用,則 1。...