GC常用演算法

2021-10-12 17:23:07 字數 1932 閱讀 2372

jvm在進行gc時,並不是對這三個區域統-一**。 大部分時候,**都是新生代~

●新生代

●倖存區(form, to)

●老年區

gc兩種類:輕gc (普通的gc), 重gc (全域性gc)

倖存區的from和to是動態變化的,誰空誰是to

gc常用演算法

引用計數器演算法:

原理:此物件有乙個引用,則+1;刪除乙個引用,則-1。只用收集計數為0的物件。

缺點:無法處理迴圈引用的問題。如:物件a和b分別有欄位b、a,令a.b=b和b.a=a,除此之外這2個物件再無任何引用,那實際上這2個物件已經不可能再被訪問,但是引用計數演算法卻無法**他們。

複製演算法:

複製演算法就是將記憶體空間按容量分成兩塊。當這一塊記憶體用完的時候,就將還存活著的物件複製到另外一塊上面,然後把已經使用過的這一塊一次清理掉。這樣使得每次都是對半塊記憶體進行記憶體**。記憶體分配時就不用考慮記憶體碎片等複雜情況,只要移動堆頂的指標,按順序分配記憶體即可,實現簡單,執行高效。

eden中存活的物件會被複製到to中

●好處:沒有記憶體的碎片~

●壞處:浪費了記憶體空間~ :多了- -半空間永遠是空to。 假設物件100%存活(極端情況)

複製演算法最佳使用場景:物件存活度較低的時候;新生區~

標記清除演算法:

該演算法分為標記和清除兩個階段。標記就是把所有活動物件都做上標記的階段;清除就是將沒有做上標記的物件進行**的階段

●優點:不需要額外的空間!

●缺點:兩次掃瞄,嚴重浪費時間,會產生記憶體碎片。

標記壓縮:

標記-壓縮演算法與標記-清理演算法類似,只是後續步驟是讓所有存活的物件移動到一端,然後直接清除掉端邊界以外的記憶體。

標記清除壓縮:

先進行幾次標記清除,然後再壓縮

總結:

記憶體效率:複製演算法》標記清除演算法》標記壓縮演算法(時間複雜度)

記憶體整齊度:複製演算法=標記壓縮演算法》標記清除演算法

記憶體利用率:標記壓縮演算法=標記清除演算法》複製演算法

思考一乙個問題:難道沒有最優演算法嗎?

答案:沒有,沒有最好的演算法,只有最合適的演算法—>- gc :分代收集演算法

年輕代:

●存活率低

●複製演算法!

老年代:

●區域大:存活率

●標記清除(記憶體碎片不是太多) +標記壓縮混合實現

gc題目:

●jvm的記憶體模型和分割槽~詳細到每個區放什麼?

●堆裡面的分割槽有哪些? eden, form, to,老年區,說說他們的特點!

●gc的演算法有哪些?標記清除法,標記壓縮,複製演算法,引用計數器,怎麼用的?

●輕gc和重gc分別在什麼時候發生?

GC演算法 筆記 GC標記 壓縮演算法

將 gc標記 清除演算法與gc複製演算法相結合。一 lisp2演算法 標記階段結束後進入壓縮階段,壓縮階段縮小被標記節點之間的距離。compaction phase set forwarding ptr adjust ptr move obj 優點 可有效利用堆 缺點 壓縮花費計算成本 二 two ...

GC演算法 複製演算法

複製演算法就是將記憶體空間二等分,每次只使用其中一塊.當執行gc時,講a部分的所有活動物件集體移到b中,就可以講a全部釋放.畫個圖就是 在執行gc前,記憶體長這樣 當執行gc後,記憶體就變成這樣了 還記得標記清除演算法的問題是什麼嗎?記憶體碎片化嚴重.現在好了,碎片化問題解決了,每次gc執行後,記憶...

GC複製演算法

gc複製演算法 它是把某一空間的活動物件全部複製到另乙個空間,複製完成後gc也就結束了 一起看下gc複製演算法的copying函式 copying copy函式在複製時會先檢查是否已被複製,若已被複製,不再操作,否則進行複製,貼上copied標籤複製完成返回新空間的位址,這樣即使有多個物件引用obj...