JVM GC(分代收集演算法)

2021-10-07 22:05:57 字數 1707 閱讀 6807

為什麼是分代呢,因為他在每個代中採用的不同的演算法;

堆的記憶體結構

總體來說:

1.引用計數法:簡單來說當這個引用計數為0時 清理

2:複製演算法(copying)(新生區的演算法)

年輕代中使用的是minor gc,這種gc演算法採用的是複製演算法(copying);

簡單來說就是將倖存者從a複製到b,

這種演算法的好處正如途中所描述:

3:標記清除(mark-sweep)(養老區)

老年代一般是由標記清除或者是標記清除與標記整理的混合實現

可以看出:這種演算法需要掃瞄兩遍,與上面的複製演算法相比多掃瞄了一遍

與上面的複製演算法相比

優點:

4:標記壓縮(mark-compact)(養老區)

老年代一般是由標記清除或者是標記清除與標記整理的混合實現

原理:

標記的存活物件將會被整理,按照記憶體位址依次排列,而未被標記的記憶體會被清理掉;

如此一來,當我們需要給新物件分配記憶體時,jvm只需要持有乙個記憶體的起始位址即可,這比維護乙個空閒列表顯然少了許多開銷。

優點:

5:標記清除壓縮(mark-sweep-compact)

簡單來說就是上面兩種的結合

首先先進行標記清除;但凡碎片多了在進行一次標記壓縮

這樣就結合了兩個的優點,同時減少移動物件的成本

每種每種演算法在時間和空間上都有其優勢和不足;

記憶體利用率:標記整理演算法=標記清除演算法》複製演算法。

可以看出,效率上來說,複製演算法是當之無愧的老大,但是卻浪費了太多記憶體,而為了盡量兼顧上面所提到的三個指標,標記/整理演算法相對來說更平滑一些,但效率上依然不盡如人意,它比複製演算法多了乙個標記的階段,又比標記/清除多了乙個整理記憶體的過程年輕代(young gen)

年輕代特點是區域相對老年代較小,對像存活率低。

這種情況複製演算法的**整理,速度是最快的。複製演算法的效率只和當前存活對像大小有關,因而很適用於年輕代的**。而複製演算法記憶體利用率不高的問題,通過hotspot中的兩個survivor的設計得到緩解

老年代(tenure gen)

老年代的特點是區域較大,對像存活率高。

這種情況,存在大量存活率高的對像,複製演算法明顯變得不合適。一般是由標記清除或者是標記清除與標記整理的混合實現。

老年代一般是由標記清除或者是標記清除與標記整理的混合實現。以hotspot中的cms**器為例,cms是基於mark-sweep實現的,對於對像的**效率很高,而對於碎片問題,cms採用基於mark-compact演算法的serial old**器做為補償措施:當記憶體**不佳(碎片導致的concurrent mode failure時),將採用serial old執行full gc以達到對老年代記憶體的整理。

jvm GC 各個分代記憶體大小配置

回憶一下 日誌工具上網搜下 各分割槽的大小對gc的效能影響很大。如何將各分割槽調整到合適的大小,分析活躍資料的大小是很好的切入點。活躍資料的大小是指,應用程式穩定執行時長期存活物件在堆中占用的空間大小,也就是full gc後堆中老年代占用空間的大小。可以通過gc日誌中full gc之後老年代資料大小...

每日五分鐘,玩轉 JVM GC 概覽

gc garbage collection 是我們在學習 jvm 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 gc。做一件事情之前,我們一定要去知道我們為什麼要去做,這裡不僅僅指 gc,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。下面我們先去了解為什麼要有 gc,以及...

基本演算法收集

girlcool專欄,稍加整理 氣泡排序 void bubble sort int array,int len 插入排序 void insert sort int array,int len array j tmp 將當前i放到插入位置j處,此輪插入完畢 break 選擇排序 void select...