日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm垃圾回收之垃圾收集器

發(fā)布時(shí)間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm垃圾回收之垃圾收集器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

概念

  • 圖中展示了7種不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;
  • 而它們所處區(qū)域,則表明其是屬于新生代收集器還是老年代收集器:
  • 新生代收集器:Serial、ParNew、Parallel Scavenge;
  • 老年代收集器:Serial Old、Parallel Old、CMS;
  • 整堆收集器:G1;
  • 兩個(gè)收集器間有連線,表明它們可以搭配使用:Serial/Serial Old、Serial/CMS、ParNew/Serial Old、ParNew/CMS、Parallel Scavenge/Serial Old、Parallel Scavenge/Parallel Old、G1;
  • 其中Serial Old作為CMS出現(xiàn)“Concurrent Mode Failure”失敗的后備預(yù)案。
  • 并發(fā)和并行收集器:

  • 并行(Parallel):指多條垃圾收集線程并行工作,但此時(shí)用戶線程仍然處于等待狀態(tài); 如ParNew、Parallel Scavenge、Parallel Old;
  • 并發(fā)(Concurrent):指用戶線程與垃圾收集線程同時(shí)執(zhí)行(但不一定是并行的,可能會(huì)交替執(zhí)行); 用戶程序在繼續(xù)運(yùn)行,而垃圾收集程序線程運(yùn)行于另一個(gè)CPU上;如CMS、G1(也有并行);
  • Minor and Full GC:

  • Minor GC:又稱新生代GC,指發(fā)生在新生代的垃圾收集動(dòng)作;因?yàn)镴ava對象大多是朝生夕滅,所以Minor GC非常頻繁,一般回收速度也比較快;
  • Full GC:又稱Major GC或老年代GC,指發(fā)生在老年代的GC;出現(xiàn)Full GC經(jīng)常會(huì)伴隨至少一次的Minor GC(不是絕對,Parallel Sacvenge收集器就可以選擇設(shè)置Major GC策略);Major GC速度一般比Minor GC慢10倍以上;
  • GC詳細(xì)分類:

  • 針對HotSpot VM的實(shí)現(xiàn),它里面的GC其實(shí)準(zhǔn)確分類只有兩大類(Partial GC、Full GC)
  • Partial GC:并不收集整個(gè)GC堆的模式
  • Young GC:只收集young gen的GC
  • Old GC:只收集old gen的GC。只有CMS的concurrent collection是這個(gè)模式Mixed
  • GC:收集整個(gè)young gen以及部分old gen的GC。只有G1有這個(gè)模式
  • Full GC:收集整個(gè)堆,包括young gen、old gen、perm gen(如果存在的話)等所有部分的模式
  • Major GC通常是跟full GC是等價(jià)的,收集整個(gè)GC堆。

    GC觸發(fā)時(shí)機(jī):

  • 最簡單的分代式GC策略,按HotSpot VM的serial GC的實(shí)現(xiàn)來看,觸發(fā)條件是:
  • Young GC:當(dāng)young gen中的eden區(qū)分配滿的時(shí)候觸發(fā)。注意young GC中有部分存活對象會(huì)晉升到old gen, 所以young GC后old gen的占用量通常會(huì)有所升高。
  • Full GC:當(dāng)準(zhǔn)備要觸發(fā)一次young GC時(shí),如果發(fā)現(xiàn)統(tǒng)計(jì)數(shù)據(jù)說之前young GC的平均晉升大小比目前old gen 剩余的空間大,則不會(huì)觸發(fā)young GC而是轉(zhuǎn)為觸發(fā)full GC(因?yàn)镠otSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都會(huì)同時(shí)收集整個(gè)GC堆,包括young gen,所以不需要事先觸發(fā)一次單獨(dú)的young GC);或者,如果有perm gen的話,要在perm gen分配空間但已經(jīng)沒有足夠空間時(shí),也要觸發(fā)一次full GC;或者System.gc()、heap dump的GC,默認(rèn)也是觸發(fā)full GC。
  • HotSpot VM里其它非并發(fā)GC的觸發(fā)條件復(fù)雜一些,不過大致的原理與上面說的其實(shí)一樣。當(dāng)然也總有例外。Parallel Scavenge(-XX:+UseParallelGC)框架下,默認(rèn)是在要觸發(fā)full GC前先執(zhí)行一次young GC,并且兩次GC之間能讓應(yīng)用程序稍微運(yùn)行一小下,以期降低full GC的暫停時(shí)間(因?yàn)閥oung GC會(huì)盡量清理了young gen的死對象,減少了full GC的工作量)。控制這個(gè)行為的VM參數(shù)是-XX:+ScavengeBeforeFullGC。
  • 并發(fā)GC的觸發(fā)條件就不太一樣。以CMS GC為例,它主要是定時(shí)去檢查old gen的使用量,當(dāng)使用量超過了觸發(fā)比例就會(huì)啟動(dòng)一次CMS GC,對old gen做并發(fā)收集。
  • safepoint(安全點(diǎn))

  • 什么是安全點(diǎn):安全點(diǎn)是在程序執(zhí)行期間的所有GC Root已知并且所有堆對象的內(nèi)容一致的點(diǎn)。從全局的角度來看,所有線程必須在GC運(yùn)行之前在安全點(diǎn)阻塞。也就是說當(dāng)線程運(yùn)行到安全點(diǎn)時(shí),堆對象狀態(tài)是確定一致的,JVM可以安全地進(jìn)行操作,如GC,偏向鎖解除等。
  • 安全點(diǎn)位置:
  • safepoint:“A point in program where the state of execution is known by the VM”。不同JVM實(shí)現(xiàn)會(huì)選用不同的位置放置安全點(diǎn)。
  • 以HotSpot VM為例,在解釋器里每條字節(jié)碼的邊界都可以是一個(gè)安全點(diǎn),因?yàn)镠otSpot的解釋器總是能很容易的找出完整的“state of execution”。
  • 而在JIT編譯的代碼里,HotSpot會(huì)在所有方法的臨返回之前,以及所有非counted loop的循環(huán)的回跳之前放置安全點(diǎn)。
  • Serial收集器:

  • 特點(diǎn):針對新生代;采用復(fù)制算法;單線程收集; “Stop The World”,即進(jìn)行垃圾收集時(shí),必須暫停所有工作線程,直到完成;
  • 應(yīng)用場景:
  • 依然是HotSpot在Client模式下默認(rèn)的新生代收集器;
  • 優(yōu)勢:簡單高效(與其他收集器的單線程相比); 對于限定單個(gè)CPU的環(huán)境來說,Serial收集器沒有線程交互(切換)開銷,可以獲得最高的單線程收集效率;
  • 在用戶的桌面應(yīng)用場景中,可用內(nèi)存一般不大(< 200M),可以在較短時(shí)間內(nèi)完成垃圾收集,只要不頻繁發(fā)生,這是可以接受的。
  • 設(shè)置參數(shù):“-XX:+UseSerialGC”:添加該參數(shù)來顯式的使用串行垃圾收集器。
  • ParNew收集器:

  • 特點(diǎn):ParNew垃圾收集器是Serial收集器的多線程版本。除了多線程外,其余的行為、特點(diǎn)和Serial收集器一樣,如:Serial收集器可用控制參數(shù)、收集算法、Stop The World、內(nèi)存分配規(guī)則、回收策略等;
  • 應(yīng)用場景:在Server模式下,ParNew收集器是一個(gè)非常重要的收集器,因?yàn)槌齋erial外,目前只有它能與CMS收集器配合工作。但在單個(gè)CPU環(huán)境中,不會(huì)比Serail收集器有更好的效果,因?yàn)榇嬖诰€程交互開銷。
  • 設(shè)置參數(shù):
  • “-XX:+UseConcMarkSweepGC”:指定使用CMS后,會(huì)默認(rèn)使用ParNew作為新生代收集器;
  • “-XX:+UseParNewGC”:強(qiáng)制指定使用ParNew;
  • “-XX:ParallelGCThreads”:指定垃圾收集的線程數(shù)量,ParNew默認(rèn)開啟的收集線程與CPU的數(shù)量相同。
  • 為什么只有Serial,ParNew能與CMS收集器配合?
  • CMS是HotSpot在JDK1.5推出的第一款真正意義上的并發(fā)(Concurrent)收集器,第一次實(shí)現(xiàn)了讓垃圾收集線程與用戶線程(基本上)同時(shí)工作;CMS作為老年代收集器,但卻無法與JDK1.4已經(jīng)存在的新生代收集器Parallel Scavenge配合工作。
  • 因?yàn)镻arallel Scavenge(以及G1)都沒有使用傳統(tǒng)的GC收集器代碼框架,而另外獨(dú)立實(shí)現(xiàn);而其余幾種收集器則共用了部分的框架代碼。
  • Parallel Scavenge收集器-吞吐量(吞吐量收集器(Throughput Collector)):

  • 吞吐量(Throughput):CPU用于運(yùn)行用戶代碼的時(shí)間與CPU總消耗時(shí)間的比值;
  • 即:吞吐量=運(yùn)行用戶代碼時(shí)間 /(運(yùn)行用戶代碼時(shí)間+垃圾收集時(shí)間); 高吞吐量即減少垃圾收集時(shí)間,讓用戶代碼獲得更長的運(yùn)行時(shí)間;
  • 垃圾收集器期望的目標(biāo)(關(guān)注點(diǎn)):
  • 停頓時(shí)間:停頓時(shí)間越短就適合需要與用戶交互的程序;良好的響應(yīng)速度能提升用戶體驗(yàn);
  • 吞吐量:高吞吐量則可以高效率地利用CPU時(shí)間,盡快完成運(yùn)算的任務(wù);主要適合在后臺(tái)計(jì)算而不需要太多交互的任務(wù);
  • 覆蓋區(qū)(Footprint):在達(dá)到前面兩個(gè)目標(biāo)的情況下,盡量減少堆的內(nèi)存空間;可以獲得更好的空間局部性;
  • 特點(diǎn):有一些特點(diǎn)與ParNew收集器相似:新生代收集器;采用復(fù)制算法;多線程收集;
  • 主要特點(diǎn):它的關(guān)注點(diǎn)與其他收集器不同。CMS等收集器的關(guān)注點(diǎn)是盡可能地縮短垃圾收集時(shí)用戶線程的停頓時(shí)間; 而Parallel Scavenge收集器的目標(biāo)則是達(dá)到一個(gè)可控制的吞吐量(Throughput)。
  • 應(yīng)用場景:高吞吐量為目標(biāo),即減少垃圾收集時(shí)間,讓用戶代碼獲得更長的運(yùn)行時(shí)間;
  • 當(dāng)應(yīng)用程序運(yùn)行在具有多個(gè)CPU上,對暫停時(shí)間沒有特別高的要求時(shí),即程序主要在后臺(tái)進(jìn)行計(jì)算,而不需要與用戶進(jìn)行太多交互; 例如:那些執(zhí)行批量處理、訂單處理、工資支付、科學(xué)計(jì)算的應(yīng)用程序。
  • GC參數(shù)設(shè)置:
  • “-XX:MaxGCPauseMillis“:控制最大垃圾收集停頓時(shí)間,大于0的毫秒數(shù);MaxGCPauseMillis設(shè)置得稍小,停頓時(shí)間可能會(huì)縮短,但也可能會(huì)使得吞吐量下降;因?yàn)榭赡軐?dǎo)致垃圾收集發(fā)生得更頻繁;
  • “-XX:GCTimeRatio”:設(shè)置垃圾收集時(shí)間占總時(shí)間的比率,0<n<100的整數(shù); GCTimeRatio相當(dāng)于設(shè)置吞吐量大小;垃圾收集執(zhí)行時(shí)間占應(yīng)用程序執(zhí)行時(shí)間的比例的計(jì)算方法是:1 / (1 + n);例如,選項(xiàng)-XX:GCTimeRatio=19,設(shè)置了垃圾收集時(shí)間占總時(shí)間的5%==1/(1+19);默認(rèn)值是1%==1/(1+99),即:n=99。
  • “-XX:+UseAdptiveSizePolicy”:開啟這個(gè)參數(shù)后,就不用手工指定一些細(xì)節(jié)參數(shù),如:新生代的大小(-Xmn)、Eden與Survivor區(qū)的比例(-XX:SurvivorRation)、晉升老年代的對象年齡(XX:PretenureSizeThreshold)等;JVM會(huì)根據(jù)當(dāng)前系統(tǒng)運(yùn)行情況收集性能監(jiān)控信息,動(dòng)態(tài)調(diào)整這些參數(shù),以提供最合適的停頓時(shí)間或最大的吞吐量, 這種調(diào)節(jié)方式稱為GC自適應(yīng)的調(diào)節(jié)策略(GC Ergonomiscs);
  • 一種值得推薦的方式:
  • 只需設(shè)置好內(nèi)存數(shù)據(jù)大小(如:"-Xmx"設(shè)置最大堆);然后使用"-XX:MaxGCPauseMillis"或"-XX:GCTimeRatio"給JVM設(shè)置一個(gè)優(yōu)化目標(biāo);那些具體細(xì)節(jié)參數(shù)的調(diào)節(jié)就由JVM自適應(yīng)完成。
  • 這也是Parallel Scavenge收集器與ParNew收集器一個(gè)重要區(qū)別。
  • 老年代收集器-Serial-old

  • 特點(diǎn):針對老年代;采用"標(biāo)記-整理"算法(還有壓縮,Mark-Sweep-Compact);單線程收集;
  • 應(yīng)用場景:主要用于Client模式;而在Server模式有兩大用途:
  • 在JDK1.5及之前,與Parallel Scavenge收集器搭配使用(JDK1.6有Parallel Old收集器可搭配);
  • 作為CMS收集器的后備預(yù)案,在并發(fā)收集發(fā)生Concurrent Mode Failure時(shí)使用
  • Parallel Old收集器:Parallel Old垃圾收集器是Parallel Scavenge收集器的老年代版本

  • 特點(diǎn):針對老年代;采用"標(biāo)記-整理"算法; 多線程收集;
  • 應(yīng)用場景:JDK1.6及之后用來代替老年代的Serial Old收集器; 特別是在Server模式,多CPU的情況下;這樣在注重吞吐量以及CPU資源敏感的場景,就有了Parallel Scavenge加Parallel Old收集器的"給力"應(yīng)用組合;
  • 設(shè)置參數(shù):"-XX:+UseParallelOldGC":指定使用Parallel Old收集器;
  • CMS收集器:并發(fā)標(biāo)記清理(Concurrent Mark Sweep,CMS)收集器也稱為并發(fā)低停頓收集器(Concurrent Low Pause Collector)或低延遲(low-latency)垃圾收集器;

  • 特點(diǎn):針對老年代;基于"標(biāo)記-清除"算法(不進(jìn)行壓縮操作,產(chǎn)生內(nèi)存碎片); 以獲取最短回收停頓時(shí)間為目標(biāo);并發(fā)收集、低停頓;需要更多的內(nèi)存(看后面的缺點(diǎn));是HotSpot在JDK1.5推出的第一款真正意義上的并發(fā)(Concurrent)收集器;第一次實(shí)現(xiàn)了讓垃圾收集線程與用戶線程(基本上)同時(shí)工作;
  • 應(yīng)用場景:與用戶交互較多的場景;希望系統(tǒng)停頓時(shí)間最短,注重服務(wù)的響應(yīng)速度; 以給用戶帶來較好的體驗(yàn);如常見WEB、B/S系統(tǒng)的服務(wù)器上的應(yīng)用;
  • 設(shè)置參數(shù):"-XX:+UseConcMarkSweepGC":指定使用CMS收集器;
  • CMS收集器運(yùn)作過程:
  • 初始標(biāo)記(CMS initial mark):僅標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對象; 速度很快;但需要"Stop The World";
  • 并發(fā)標(biāo)記(CMS concurrent mark):進(jìn)行GC Roots Tracing的過程;剛才產(chǎn)生的集合中標(biāo)記出存活對象;應(yīng)用程序也在運(yùn)行;
  • 重新標(biāo)記(CMS remark):為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記變動(dòng)的那一部分對象的標(biāo)記記錄; 需要"Stop The World",且停頓時(shí)間比初始標(biāo)記稍長,但遠(yuǎn)比并發(fā)標(biāo)記短;采用多線程并行執(zhí)行來提升效率;
  • 并發(fā)清除(CMS concurrent sweep:回收所有的垃圾對象;整個(gè)過程中耗時(shí)最長的并發(fā)標(biāo)記和并發(fā)清除都可以與用戶線程一起工作; 所以總體上說,CMS收集器的內(nèi)存回收過程與用戶線程一起并發(fā)執(zhí)行;
  • 明顯的缺點(diǎn):
  • 對CPU資源非常敏感:并發(fā)收集雖然不會(huì)暫停用戶線程,但因?yàn)檎加靡徊糠諧PU資源,還是會(huì)導(dǎo)致應(yīng)用程序變慢,總吞吐量降低。CMS的默認(rèn)收集線程數(shù)量是=(CPU數(shù)量+3)/4;當(dāng)CPU數(shù)量多于4個(gè),收集線程占用的CPU資源多于25%,對用戶程序影響可能較大;不足4個(gè)時(shí),影響更大,可能無法接受。
  • 無法處理浮動(dòng)垃圾,可能出現(xiàn)"Concurrent Mode Failure"失敗
  • *浮動(dòng)垃圾(Floating Garbage):*在并發(fā)清除時(shí),用戶線程新產(chǎn)生的垃圾,稱為浮動(dòng)垃圾;這使得并發(fā)清除時(shí)需要預(yù)留一定的內(nèi)存空間,不能像其他收集器在老年代幾乎填滿再進(jìn)行收集; 也要可以認(rèn)為CMS所需要的空間比其他垃圾收集器大;"-XX:CMSInitiatingOccupancyFraction":設(shè)置CMS預(yù)留內(nèi)存空間;
  • "Concurrent Mode Failure"失敗:如果CMS預(yù)留內(nèi)存空間無法滿足程序需要,就會(huì)出現(xiàn)一次"Concurrent Mode Failure"失敗; 這時(shí)JVM啟用后備預(yù)案:臨時(shí)啟用Serail Old收集器,而導(dǎo)致另一次Full GC的產(chǎn)生;
  • 產(chǎn)生大量內(nèi)存碎片:由于CMS基于"標(biāo)記-清除"算法,清除后不進(jìn)行壓縮操作;產(chǎn)生大量不連續(xù)的內(nèi)存碎片會(huì)導(dǎo)致分配大內(nèi)存對象時(shí),無法找到足夠的連續(xù)內(nèi)存,從而需要提前觸發(fā)另一次Full GC動(dòng)作。解決方法:
  • “-XX:+UseCMSCompactAtFullCollection”:使得CMS出現(xiàn)上面這種情況時(shí)不進(jìn)行Full GC,而開啟內(nèi)存碎片的合并整理過程; 但合并整理過程無法并發(fā),停頓時(shí)間會(huì)變長;默認(rèn)開啟(但不會(huì)進(jìn)行,結(jié)合下面的CMSFullGCsBeforeCompaction);
  • “-XX:+CMSFullGCsBeforeCompaction”: 設(shè)置執(zhí)行多少次不壓縮的Full GC后,來一次壓縮整理; 為減少合并整理過程的停頓時(shí)間;默認(rèn)為0,也就是說每次都執(zhí)行Full GC,不會(huì)進(jìn)行壓縮整理;
  • 由于空間不再連續(xù),CMS需要使用可用"空閑列表"內(nèi)存分配方式,這比簡單實(shí)用"碰撞指針"分配內(nèi)存消耗大; 總體來看,與Parallel Old垃圾收集器相比,CMS減少了執(zhí)行老年代垃圾收集時(shí)應(yīng)用暫停的時(shí)間; 但卻增加了新生代垃圾收集時(shí)應(yīng)用暫停的時(shí)間、降低了吞吐量而且需要占用更大的堆空間;
  • G1收集器:JDK7-u4才推出商用的收集器

  • 特點(diǎn):
  • 并行與并發(fā):能充分利用多CPU、多核環(huán)境下的硬件優(yōu)勢; 可以并行來縮短"Stop The World"停頓時(shí)間; 也可以并發(fā)讓垃圾收集與用戶程序同時(shí)進(jìn)行;
  • 分代收集,收集范圍包括新生代和老年代: 能獨(dú)立管理整個(gè)GC堆(新生代和老年代),而不需要與其他收集器搭配; 能夠采用不同方式處理不同時(shí)期的對象;雖然保留分代概念,但Java堆的內(nèi)存布局有很大差別;將整個(gè)堆劃分為多個(gè)大小相等的獨(dú)立區(qū)域(Region);新生代和老年代不再是物理隔離,它們都是一部分Region(不需要連續(xù))的集合;
  • 結(jié)合多種垃圾收集算法,空間整合,不產(chǎn)生碎片從整體看,是基于標(biāo)記-整理算法;從局部(兩個(gè)Region間)看,是基于復(fù)制算法; 這是一種類似火車算法的實(shí)現(xiàn);都不會(huì)產(chǎn)生內(nèi)存碎片,有利于長時(shí)間運(yùn)行;
  • 可預(yù)測的停頓:低停頓的同時(shí)實(shí)現(xiàn)高吞吐量,G1除了追求低停頓處,還能建立可預(yù)測的停頓時(shí)間模型;可以明確指定M毫秒時(shí)間片內(nèi),垃圾收集消耗的時(shí)間不超過N毫秒;
  • 應(yīng)用場景: 面向服務(wù)端應(yīng)用,針對具有大內(nèi)存、多處理器的機(jī)器;最主要的應(yīng)用是為需要低GC延遲,并具有大堆的應(yīng)用程序提供解決方案; 如:在堆大小約6GB或更大時(shí),可預(yù)測的暫停時(shí)間可以低于0.5秒;用來替換掉JDK1.5中的CMS收集器;在下面的情況時(shí),使用G1可能比CMS好:
  • 超過50%的Java堆被活動(dòng)數(shù)據(jù)占用;
  • 對象分配頻率或年代提升頻率變化很大;
  • GC停頓時(shí)間過長(長于0.5至1秒)。
  • 設(shè)置參數(shù)
  • “-XX:+UseG1GC”:指定使用G1收集器;
  • “-XX:InitiatingHeapOccupancyPercent”:當(dāng)整個(gè)Java堆的占用率達(dá)到參數(shù)值時(shí),開始并發(fā)標(biāo)記階段;默認(rèn)為45;
  • " -XX:MaxGCPauseMillis":為G1設(shè)置暫停時(shí)間目標(biāo),默認(rèn)值為200毫秒;
  • “-XX:G1HeapRegionSize”:設(shè)置每個(gè)Region大小,范圍1MB到32MB;目標(biāo)是在最小Java堆時(shí)可以擁有約2048個(gè)Region;
  • 為什么G1收集器可以實(shí)現(xiàn)可預(yù)測的停頓:
  • 可以有計(jì)劃地避免在Java堆的進(jìn)行全區(qū)域的垃圾收集;
  • G1跟蹤各個(gè)Region獲得其收集價(jià)值大小,在后臺(tái)維護(hù)一個(gè)優(yōu)先列表;
  • 每次根據(jù)允許的收集時(shí)間,優(yōu)先回收價(jià)值最大的Region(名稱Garbage-First的由來);
  • 這就保證了在有限的時(shí)間內(nèi)可以獲取盡可能高的收集效率;
  • G1收集器運(yùn)作過程:
  • 初始標(biāo)記(Initial Marking): 僅標(biāo)記一下GC Roots能直接關(guān)聯(lián)到的對象;且修改TAMS(Next Top at Mark Start),讓下一階段并發(fā)運(yùn)行時(shí),用戶程序能在正確可用的Region中創(chuàng)建新對象;需要"Stop The World",但速度很快;
  • 并發(fā)標(biāo)記(Concurrent Marking): 進(jìn)行GC Roots Tracing的過程;剛才產(chǎn)生的集合中標(biāo)記出存活對象;耗時(shí)較長,但應(yīng)用程序也在運(yùn)行;并不能保證可以標(biāo)記出所有的存活對象;
  • 最終標(biāo)記(Final Marking): 為了修正并發(fā)標(biāo)記期間因用戶程序繼續(xù)運(yùn)作而導(dǎo)致標(biāo)記變動(dòng)的那一部分對象的標(biāo)記記錄;上一階段對象的變化記錄在線程的Remembered Set Log;這里把Remembered Set Log合并到Remembered Set中;需要"Stop The World",且停頓時(shí)間比初始標(biāo)記稍長,但遠(yuǎn)比并發(fā)標(biāo)記短; 采用多線程并行執(zhí)行來提升效率;
  • 篩選回收(Live Data Counting and Evacuation): 首先排序各個(gè)Region的回收價(jià)值和成本;然后根據(jù)用戶期望的GC停頓時(shí)間來制定回收計(jì)劃; 最后按計(jì)劃回收一些價(jià)值高的Region中垃圾對象;回收時(shí)采用"復(fù)制"算法,從一個(gè)或多個(gè)Region復(fù)制存活對象到堆上的另一個(gè)空的Region,并且在此過程中壓縮和釋放內(nèi)存;可以并發(fā)進(jìn)行,降低停頓時(shí)間,并增加吞吐量;
  • JVM常用啟動(dòng)參數(shù):

  • -Xmx1024m,-Xmx1g 單位(g,m,k)
  • -Xms512m
  • -Xmn256m(相當(dāng)于將新生代的初始、最小、最大值設(shè)置為同一個(gè):-XX:NewSize = -XX:MaxNewSize)
  • -Xss512k
  • -XX:PretenureSizeThreshold,大于這個(gè)數(shù)量直接在老年代分配,缺省為0 表示不會(huì)直接分配在老年代;(注:如果在新生代分配失敗且對象是一個(gè)不含任何對象引用的大數(shù)組,也可被直接分配到老年代。)
  • -XX:-DisableExplicitGC,禁用顯示GC,System.gc()
  • -XX:+PrintGCDetails,打印GC詳情
  • -XX:+PrintGCTimeStamps : JVM啟動(dòng)到GC開始經(jīng)歷的時(shí)間
  • -XX:+PrintGCDateStamps : GC發(fā)生的具體時(shí)間點(diǎn)
  • -XX:+PrintCommandLineFlags: 讓JVM打印出那些已經(jīng)被用戶或者JVM設(shè)置過的詳細(xì)的XX參數(shù)的名稱和值。
  • -XX:NewRatio=2,老年代和新生代的內(nèi)存比例為2:1
  • -XX:SurvivorRatio=8,表示eden和1個(gè)survivor區(qū)的比例,survivor大小 = Xmn/(SurvivorRatio+2)
  • -Dxxx=yyy,啟動(dòng)時(shí)配置系統(tǒng)屬性,在java中通過System.getProperty(“xxx”)獲取相應(yīng)的值
  • 總結(jié)

    以上是生活随笔為你收集整理的jvm垃圾回收之垃圾收集器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。