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...