目前所有垃圾收集器都是基于分代收集理論實現(xiàn)垃圾對象的清理咧叭,根據(jù)對象存活周期將不同的對象分配到同一個內(nèi)存塊中
標(biāo)記復(fù)制算法 帶有整理的標(biāo)記算法煌妈,將可用內(nèi)存對半分一半作為使用,一半作為復(fù)制時備用,對內(nèi)存的利用率比較低
標(biāo)記清除算法 沒有整理滋戳,清除后對象內(nèi)存碎片化 容易產(chǎn)生浮動碎片垃圾
標(biāo)記整理算法 第一步和清除算法一樣斋竞,第二步進行整理將對象對齊倔约,減少碎片垃圾
Java堆中主要有年輕代和老年代 GC垃圾收集器的執(zhí)行通過JVM的minor GC和full GC執(zhí)行 GC垃圾收集器也分為老年代垃圾收集器和年輕代垃圾收集器
所有垃圾收集器都有STOP ZHE WORLD的機制(下文稱之為STW):在GC垃圾收集器執(zhí)行垃圾收集的時候,暫停所有應(yīng)用線程的執(zhí)行直到垃圾收集器執(zhí)行完成,對用戶來說可能在某一個操作出現(xiàn)卡頓,執(zhí)行慢的現(xiàn)象,對電商項目來說這是非常關(guān)注的一個點,JVM調(diào)優(yōu)的其中一個重點就是降低STW的時間增加用戶使用友好度
常見的垃圾收集器
Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
俗稱串行(單線程)垃圾收集器 能夠兼顧年輕代和老年代的垃圾收集,由于沒有多線程下的并行收集所以在單線程下有高效快速的優(yōu)點
老年代:標(biāo)記整理算法 年輕代:標(biāo)記復(fù)制算法
應(yīng)用程序線程 - > GC收集線程,應(yīng)用程序線程(暫停) - > 應(yīng)用程序線程
Parallel收集器(-XX:+UseParallelGC(年輕代),-XX:+UseParallelOldGC(老年代))
為Java默認(rèn)使用的垃圾收集器,在Serial收集器的基礎(chǔ)上加入了并行垃圾收集,是Serial收集器的多線程版本,吞吐量高,但是STW時間較長,對用戶使用不太友好
應(yīng)用程序線程 - > GC收集線程(多線程并發(fā)執(zhí)行) ,應(yīng)用程序線程(暫停)- > 應(yīng)用程序線程
ParNew收集器(-XX:+UseParNewGC)
parallel收集器的進階版本,垃圾收集流程很類似,目的是為了能和CMS收集器一起使用