JVM - 再聊GC垃圾收集算法及垃圾收集器
文章目錄
- Pre
- 分代收集理論
- 常見的垃圾收集算法
- 標(biāo)記-清除算法
- 標(biāo)記-復(fù)制算法
- 標(biāo)記-整理算法
- 垃圾收集器
- Serial收集器
- Parallel Scavenge收集器 【JDK8默認(rèn)】
- ParNew收集器
- CMS 【重點(diǎn)掌握】
Pre
JVM-04垃圾收集Garbage Collection(上)【垃圾對(duì)象的判定】
JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】
JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】
分代收集理論
當(dāng)前虛擬機(jī)的垃圾收集都采用分代收集算法 , 意思就是根據(jù)對(duì)象存活周期的不同將 java堆分為新生代和老年代,這樣就可以根據(jù)各個(gè)年代的特點(diǎn)選擇合適的垃圾收集算法。
舉個(gè)例子,新生代中,大部分對(duì)象都是朝生夕死的,所以可以選擇復(fù)制算法, 只復(fù)制那些少量存活的對(duì)象。
而老年代,絕大部分都是一些頑固的對(duì)象,存貨周期較長(zhǎng),如果選擇復(fù)制算法,就要復(fù)制很多對(duì)象,效率自然不高 ,所以得換個(gè)算法,通常會(huì)選擇標(biāo)記-清除”或“標(biāo)記-整理”算法進(jìn)行垃圾收集。
常見的垃圾收集算法
標(biāo)記-清除算法
兩個(gè)階段 “標(biāo)記” + “清除”
存在兩個(gè)問題
基于這個(gè)缺點(diǎn),進(jìn)化除了 標(biāo)記-整理 ,多了一步整理內(nèi)存碎片。
標(biāo)記-復(fù)制算法
它將內(nèi)存分為大小相同的兩塊,每次使用其中的一塊。
當(dāng)這一塊的內(nèi)存使用完后,就將還存活的對(duì)象復(fù)制到另一塊去,然后再把使用的空間一次清理掉。
這樣就使每次的內(nèi)存回收都是對(duì)內(nèi)存區(qū)間的一半進(jìn)行回收。
-
優(yōu)點(diǎn):常用于新生代,存活的對(duì)象少,復(fù)制這些存活的對(duì)象,效率高。
-
缺點(diǎn) 顯而易見: 浪費(fèi)空間
標(biāo)記-整理算法
根據(jù)老年代的特點(diǎn)演化出一種標(biāo)記算法, 標(biāo)記過程同“標(biāo)記-清除” 。
移動(dòng)所有存活的對(duì)象,且按照內(nèi)存地址次序依次排列,然后將末端內(nèi)存地址以后的內(nèi)存全部回收。因此,第二階段才稱為整理階段。
垃圾收集器
為什么會(huì)有這么多GC 回收器?
因?yàn)槟壳皼]有任何一款是十分完美的,我們需要做的就是充分了解這些GC Collector 根據(jù)業(yè)務(wù)特點(diǎn)選擇合適的GC Collector 。
Serial收集器
兩個(gè)收集器 。一個(gè) 新生代Serial , 一個(gè) 老年代 Serial Old .
新生代采用復(fù)制算法,老年代采用標(biāo)記-整理算法。
JVM參數(shù)
-XX:+UseSerialGC (新生代) -XX:+UseSerialOldGC (老年代)Serial(串行)收集器是最基本、歷史最悠久的垃圾收集器 。
字面意思:
Serial Old收集器是Serial收集器的老年代版本,也是一個(gè)單線程收集器。
它主要有兩大用途:
- 一種用途是在JDK1.5以及以前的版本中與Parallel Scavenge收集器搭配使用,
- 另一種用途是作為CMS收集器的后備方案。
Parallel Scavenge收集器 【JDK8默認(rèn)】
Serial收集器的多線程版本
JVM參數(shù)
-XX:+UseParallelGC(年輕代),-XX:+UseParallelOldGC(老年代)默認(rèn)的收集線程數(shù)跟cpu核數(shù)相同,當(dāng)然也可以用參數(shù)(-XX:ParallelGCThreads)指定收集線程數(shù),但是一般不推薦修改。
Parallel Scavenge收集器關(guān)注點(diǎn)是吞吐量(高效率的利用CPU)
CMS等垃圾收集器的關(guān)注點(diǎn)更多的是用戶線程的停頓時(shí)間(提高用戶體驗(yàn))
新生代采用復(fù)制算法,老年代采用標(biāo)記-整理算法。
Parallel Old收集器是Parallel Scavenge收集器的老年代版本。使用多線程和“標(biāo)記-整理”算法。
在注重吞吐量以及CPU資源的場(chǎng)合,都可以優(yōu)先考慮 Parallel Scavenge收集器和Parallel Old收集器(JDK8默認(rèn)的新生代和老年代收集器)。
ParNew收集器
What ? ParNew ? 不是有個(gè)Parallel 嗎? 又出來這個(gè)主要是因?yàn)镻arallel 不能和CMS搭配使用,所以官方又弄出個(gè)這么個(gè)玩意兒。
JVM參數(shù)
-XX:+UseParNewGCParNew收集器其實(shí)跟Parallel收集器很類似,區(qū)別主要在于它可以和CMS收集器配合使用。
新生代采用復(fù)制算法,老年代采用標(biāo)記-整理算法。
互聯(lián)網(wǎng)公司 小內(nèi)存的機(jī)器 主流的GC組合 就是 ParNew + CMS .
CMS 【重點(diǎn)掌握】
JVM參數(shù)
-XX:+UseConcMarkSweepGC(老年代)詳細(xì)的四個(gè)步驟、CMS存在的問題以及三色標(biāo)記我們下篇博文繼續(xù)展開
總結(jié)
以上是生活随笔為你收集整理的JVM - 再聊GC垃圾收集算法及垃圾收集器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM-剖析对象内存分配流程
- 下一篇: JVM - CMS深度剖析