JVM垃圾回收算法你都知道嗎?
Python實戰(zhàn)社群
Java實戰(zhàn)社群
長按識別下方二維碼,按需求添加
掃碼關(guān)注添加客服
進(jìn)Python社群▲
掃碼關(guān)注添加客服
進(jìn)Java社群▲
作者丨java金融
來源丨java金融
怎么判斷對象"已死"?
1.引用計數(shù)法
不能解決對象循環(huán)依賴的問題。因此一般不用這種。
2.可達(dá)性分析算法。
GCRoots 不可達(dá)時 對象死,采用這個。
垃圾收集算法
1.標(biāo)記清除算法
1.標(biāo)記、清除階段效率不高。
2.標(biāo)記清除之后會產(chǎn)生大量不連續(xù)的碎片,導(dǎo)致分配較大的對象時候,無法找到足夠的連續(xù)內(nèi)存。
2.復(fù)制算法
1.兩塊相同的內(nèi)存空間,一塊使用,一塊空閑,導(dǎo)致空間浪費。不存在碎片問題。
3.記整理算法
1.標(biāo)記過程與"標(biāo)記清除算法"一樣,整理過程是讓所有存活對象都往一端移動,然后直接清理掉邊界以外的內(nèi)存。
4.分代收集算法。
把對象進(jìn)行分代,新生代和來年代。
總結(jié)
新生代一般用復(fù)制算法,老年代一般用標(biāo)記整理或者標(biāo)記清除算法。
垃圾收集器
Serial收集器
作用于新生代
單線程收集
采用復(fù)制算法
開啟方式:-XX:+UseSerialGC
Client模式下的默認(rèn)新生代收集器。進(jìn)行垃圾收集時,必須Stop the world,直到它收集結(jié)束
ParNew收集器
作用于新生代。
多線程收集
采用復(fù)制算法
-XX:+UseParNewGC-XX:ParallelGCThreans=2(2指定垃圾收集的線程數(shù))
Server模式下的默認(rèn)新生代收集器
ParallelScavenge收集器
新生代
多線程
復(fù)制算法
-XX:MaxGCPauseMillis控制最大垃圾收集時間 -XX:GCTimeRatio 控制吞吐量大小
吞吐量優(yōu)先收集器目標(biāo):控制吞吐量吞吐量=運行用戶代碼時間/(運行用戶代碼時間+垃圾收集時間)吞吐量越高說明CPU時間利用率越高。
SerialOld收集器
老年代
單線程
標(biāo)記整理算法
這個收集器的主要意義也是在于給Client模式下的虛擬機使用。如果在Server模式下,主要兩大用途:1.在JDK1.5以及之前的版本中與ParallelScavenge收集器搭配使用。2.作為CMS收集器的后備預(yù)案,在并發(fā)收集發(fā)生Concurrent Mode Failure時使用
ParallelOld收集器
老年代
多線程
標(biāo)記整理
ParallelOld是ParallelScavenge收集器的老年代版本。這個收集器在1.6中才開始提供。在JDK1.5以及之前的版本中,Parallel Scavenge+Serial Old(單線程),無法充分利用多CPU的處理能力。1.6之后,終于有了名副其實的"吞吐量優(yōu)先"收集器組合:Parallel Scavenge + Parallel Old。
CMS
老年代
多線程
標(biāo)記清除算法
-XX:+UseConcMarkSweepGC新生代使用了PartNew
CMS在老年代的整個過程分為4個步驟:
1.初始標(biāo)記stop the word 僅僅標(biāo)記GC Roots能直接關(guān)聯(lián)到的對象,速度很快
2.并發(fā)標(biāo)記進(jìn)行GCRoots Tracing的過程(判斷對象是否仍在使用中)和用戶線程一起工作。3.重新標(biāo)記stop the word 修正并發(fā)標(biāo)記階段因用戶程序繼續(xù)運行而導(dǎo)致標(biāo)記發(fā)生變動的那一部分標(biāo)記記錄。此階段比初始標(biāo)記階段稍長,但遠(yuǎn)比并發(fā)標(biāo)記階段的時間短。
4.并發(fā)清除 和用戶線程一起工作。
G1 收集器
內(nèi)存組成:Eden、 Survivor、 Old、 Humongous
內(nèi)存變化:字符串內(nèi)部池,已經(jīng)在JDK7中從永久代中移除,JDK1.7中,存儲在永久代的部分?jǐn)?shù)據(jù)就已經(jīng)轉(zhuǎn)移到了JavaHeap或者是NativeHeap。但永久代仍存在于JDK1.7中,并沒完全移除,譬如符號引用(Symbols)轉(zhuǎn)移到了native heap;字面量(internedstrings)轉(zhuǎn)移到了javaheap;類的靜態(tài)變量(classstatics)轉(zhuǎn)移到了java heap持久代也移動到了普通的堆內(nèi)存空間中,改為元空間 。
大對象的分配
1 TLAB(Thread Local Allocation Buffer)線程本地分配緩沖區(qū)
2 Eden區(qū)中分配
3 Humongous區(qū)分配
GC模式
G1提供了兩種Young GC和Mixed GC,兩種都是Stop The World(STW)


近期精彩內(nèi)容推薦:??


