黨校網(wǎng)站信息化建設(shè)整改情況百度自動點(diǎn)擊器
垃圾收集器就是內(nèi)存回收的具體實(shí)現(xiàn)
Serial
Serial收集器是最基本的,發(fā)展歷史最悠久的收集器。在JDK1.3之前是虛擬機(jī)新生代收集的唯一選擇。是一種單線程收集器,只會使用一個CPU或者一條收集線程去完成垃圾收集工作,在進(jìn)行垃圾收集的時(shí)候需要暫停其他線程
優(yōu)點(diǎn):簡單高效,很高的單線程收集效率
缺點(diǎn):收集過程需要暫停所有線程
算法:復(fù)制算法
使用范圍:新生代
應(yīng)用:client模式下的默認(rèn)新生代收集器
Serial Old
?Serial Old收集器是Serial收集器的老年代版本,是一個單線程收集器,不同的采用標(biāo)記-整理算法,運(yùn)行過程和Serial收集器一樣
?ParNew
可以理解為Serial收集器的多線程版本
優(yōu)點(diǎn):在多CPU時(shí),比Serial效率高
缺點(diǎn):收集過程暫停所有應(yīng)用程序線程,單CPU時(shí)比Serial效率差
算法:復(fù)制算法
使用范圍:新生代
應(yīng)用:運(yùn)行在server模式下的虛擬機(jī)中首選的新生代收集器
Parallel Scavenge??
Parallel Scavenge收集器是一個新生代收集器。使用復(fù)制算法,并行的多線程收集器。與ParNew不同的是更關(guān)注系統(tǒng)的吞吐量
?吞吐量=運(yùn)行用戶代碼的時(shí)間/(運(yùn)行用戶代碼時(shí)間+垃圾收集時(shí)間)
?如虛擬機(jī)總共運(yùn)行了100分鐘,垃圾收集用了1分鐘吞吐量=(100-1)/100=99%
若吞吐量越大,意味著垃圾收集的時(shí)間越短,則用戶代碼可以充分利用CPU資源,盡快完成程序的運(yùn)算任務(wù)。
-XX:MaxGCPauseMillis控制最大的垃圾收集停頓時(shí)間
-XX:GCRatio直接設(shè)置吞吐量的大小
Parallel Old
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多線程標(biāo)記-整理算法進(jìn)行垃圾回收,更加關(guān)注系統(tǒng)的吞吐量
CMS
Concurrent Mark Sweep收集器是一種以獲取最短回收停頓時(shí)間為目標(biāo)的收集器
采用的是標(biāo)記-清除算法整個過程分為4步
CMS用以下方式盡可能的節(jié)省垃圾收集的時(shí)間
(1)初始標(biāo)記 CMS initial mark 標(biāo)記GC Roots直接關(guān)聯(lián)對象,不用Tracing,速度很快不耗時(shí)STW
(2)并發(fā)標(biāo)記 CMS concurrent mark 進(jìn)行 Roots Tracing 耗時(shí)? 并發(fā)
(3)重新標(biāo)記 CMS remark? ? ?修改并發(fā)標(biāo)記因用戶程序變動的內(nèi)容? 不耗時(shí) STW
(4)并發(fā)清除 CMS concurrent sweep 清除不可達(dá)對象回收空間,同時(shí)有新垃圾產(chǎn)生,留著下次清理稱為浮動垃圾
由于整個過程中,并發(fā)標(biāo)記和并發(fā)清除,收集器線程可以與用戶線程一起工作,所以總體上CMS收集器的內(nèi)存回收過程是與用戶線程一起并發(fā)地執(zhí)行的
優(yōu)點(diǎn):并發(fā)收集,低停頓
缺點(diǎn):產(chǎn)生大量空間碎片,并發(fā)階段會降低吞吐量
?卡表。。??摗?。。老年代引用新生代的GC方法實(shí)現(xiàn)
G1(Garbage-Frist)? JDK8推薦使用的 比CMS的停頓時(shí)間短。優(yōu)先回收垃圾價(jià)值高的區(qū)域,某種程度上解決空間碎片的問題
G1收集器,java堆的內(nèi)存布局與其他收集器有很大差別,它將整個java堆劃分為多個大小相等的獨(dú)立區(qū)域(Region)2048個,雖然保留新生代和老年代的概念,但新生代和老年代不再是物理隔離的。它們都是一部分Region(不需要連續(xù))的集合
每個Region大小一樣,可以是1M到32M之間的數(shù)值,但必須保證2的n次冪
如果對象太大,一個Region放不下(超過Region大小的50%)那么就會直接放到H中
設(shè)置Region大小:-XX:G1HeapRegionSize=<N>M
Garbage-Frist 其實(shí)就是優(yōu)先回收垃圾最多的Region區(qū)域
(1)分代收集(仍然保留了分代的概念)
(2)空間整合(整體上屬于標(biāo)記-整理算法,不會導(dǎo)致空間碎片)
(3)可預(yù)測的停頓(比CMS更先進(jìn)的地方在于能讓使用者明確指定一個長度為M毫秒的時(shí)間片段內(nèi),消耗在垃圾收集上的時(shí)間不得超過N毫秒)
工作過程
初始標(biāo)記(Initial Marking) 標(biāo)記以下GC Roots能夠關(guān)聯(lián)的對象,并且修改TAMS的值,需要暫停用戶線程
并發(fā)標(biāo)記(Concurremt Marking) 從GC Roots進(jìn)行可達(dá)性分析,找出存活對象,與用戶線程并發(fā)執(zhí)行
最終標(biāo)記(Final Marking) 修正在并發(fā)標(biāo)記階段因用戶程序的并發(fā)執(zhí)行導(dǎo)致變動的數(shù)據(jù),需要暫停用戶線程
篩選回收(Live Data Counting and Evacuation) 對各個Region的回收價(jià)值和成本進(jìn)行排序,根據(jù)用戶所期望的GC停頓時(shí)間指定回收計(jì)劃
?ZGC
JDK11新引入的ZGC收集器,不管是物理上還是邏輯上,ZGC中已經(jīng)不存在新老年代的概念,分為一個個page,當(dāng)進(jìn)行GC操作時(shí)會對page進(jìn)行壓縮,因此沒有碎片問題
只能在64位的Linux上使用。
(1)可以達(dá)到10ms以內(nèi)的停頓時(shí)間要求
(2)支持TB級別的內(nèi)存
(3)堆內(nèi)存變大后停頓時(shí)間還是在10ms以內(nèi)
JVM參數(shù)
標(biāo)準(zhǔn)參數(shù)
-version
-help
-server
-cp
-X參數(shù)? 非標(biāo)準(zhǔn)參數(shù),在JDK各個版本中可能會變動
-Xint 解釋執(zhí)行?
-Xcomp 第一次使用就編譯成本地代碼
-Xmixed 混合模式,JVM決定
-XX參數(shù) 使用最多的參數(shù)類型,非標(biāo)準(zhǔn)化參數(shù),相對不穩(wěn)定,主要用于JVM調(diào)優(yōu)和Debug
Boolean類型
格式:-XX:[+-]<name> ? ? ? ? ? ?+或-表示啟用或者禁用name屬性
比如:-XX:+UseConcMarkSweepGC ? 表示啟用CMS類型的垃圾回收器
?? ? -XX:+UseG1GC ? ? ? ? ? ? ?表示啟用G1類型的垃圾回收器
非Boolean類型
格式:-XX<name>=<value>表示name屬性的值是value
比如:-XX:MaxGCPauseMillis=500 ??
?其他參數(shù)
-Xms1000M等價(jià)于-XX:InitialHeapSize=1000M
-Xmx1000M等價(jià)于-XX:MaxHeapSize=1000M
-Xss100等價(jià)于-XX:ThreadStackSize=100