這篇文章給大家分享的是有關(guān)觸發(fā)JVM進(jìn)行Full GC的情況有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、荔浦網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為荔浦等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
堆內(nèi)存劃分為 Eden、Survivor 和 Tenured/Old 空間,如下圖所示:

從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱為 Minor GC,對(duì)老年代GC稱為Major GC,而Full GC是對(duì)整個(gè)堆來(lái)說(shuō)的,在最近幾個(gè)版本的JDK里默認(rèn)包括了對(duì)永生帶即方法區(qū)的回收(JDK8中無(wú)永生帶了),出現(xiàn)Full GC的時(shí)候經(jīng)常伴隨至少一次的Minor GC,但非絕對(duì)的。Major GC的速度一般會(huì)比Minor GC慢10倍以上。下邊看看有那種情況觸發(fā)JVM進(jìn)行Full GC及應(yīng)對(duì)策略。
1、System.gc()方法的調(diào)用
此方法的調(diào)用是建議JVM進(jìn)行Full GC,雖然只是建議而非一定,但很多情況下它會(huì)觸發(fā) Full GC,從而增加Full GC的頻率,也即增加了間歇性停頓的次數(shù)。強(qiáng)烈影響系建議能不使用此方法就別使用,讓虛擬機(jī)自己去管理它的內(nèi)存,可通過(guò)通過(guò)-XX:+ DisableExplicitGC來(lái)禁止RMI調(diào)用System.gc。
老年代空間只有在新生代對(duì)象轉(zhuǎn)入及創(chuàng)建為大對(duì)象、大數(shù)組時(shí)才會(huì)出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行Full GC后空間仍然不足,則拋出如下錯(cuò)誤:
java.lang.OutOfMemoryError: Java heap space
為避免以上兩種狀況引起的Full GC,調(diào)優(yōu)時(shí)應(yīng)盡量做到讓對(duì)象在Minor GC階段被回收、讓對(duì)象在新生代多存活一段時(shí)間及不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組。
JVM規(guī)范中運(yùn)行時(shí)數(shù)據(jù)區(qū)域中的方法區(qū),在HotSpot虛擬機(jī)中又被習(xí)慣稱為永生代或者永生區(qū),Permanet Generation中存放的為一些class的信息、常量、靜態(tài)變量等數(shù)據(jù),當(dāng)系統(tǒng)中要加載的類、反射的類和調(diào)用的方法較多時(shí),Permanet Generation可能會(huì)被占滿,在未配置為采用CMS GC的情況下也會(huì)執(zhí)行Full GC。如果經(jīng)過(guò)Full GC仍然回收不了,那么JVM會(huì)拋出如下錯(cuò)誤信息:
java.lang.OutOfMemoryError: PermGen space
為避免Perm Gen占滿造成Full GC現(xiàn)象,可采用的方法為增大Perm Gen空間或轉(zhuǎn)為使用CMS GC。
對(duì)于采用CMS進(jìn)行老年代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當(dāng)這兩種狀況出現(xiàn)時(shí)可能
會(huì)觸發(fā)Full GC。
promotion failed是在進(jìn)行Minor GC時(shí),survivor space放不下、對(duì)象只能放入老年代,而此時(shí)老年代也放不下造成的;concurrent mode failure是在
執(zhí)行CMS GC的過(guò)程中同時(shí)有對(duì)象要放入老年代,而此時(shí)老年代空間不足造成的(有時(shí)候“空間不足”是CMS GC時(shí)當(dāng)前的浮動(dòng)垃圾過(guò)多導(dǎo)致暫時(shí)性的空間不足觸發(fā)Full GC)。
對(duì)措施為:增大survivor space、老年代空間或調(diào)低觸發(fā)并發(fā)GC的比率,但在JDK 5.0+、6.0+的版本中有可能會(huì)由于JDK的bug29導(dǎo)致CMS在remark完畢
后很久才觸發(fā)sweeping動(dòng)作。對(duì)于這種狀況,可通過(guò)設(shè)置-XX: CMSMaxAbortablePrecleanTime=5(單位為ms)來(lái)避免。
這是一個(gè)較為復(fù)雜的觸發(fā)情況,Hotspot為了避免由于新生代對(duì)象晉升到舊生代導(dǎo)致舊生代空間不足的現(xiàn)象,在進(jìn)行Minor GC時(shí),做了一個(gè)判斷,如果之
前統(tǒng)計(jì)所得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間,那么就直接觸發(fā)Full GC。
例如程序第一次觸發(fā)Minor GC后,有6MB的對(duì)象晉升到舊生代,那么當(dāng)下一次Minor GC發(fā)生時(shí),首先檢查舊生代的剩余空間是否大于6MB,如果小于6MB,
則執(zhí)行Full GC。
當(dāng)新生代采用PS GC時(shí),方式稍有不同,PS GC是在Minor GC后也會(huì)檢查,例如上面的例子中第一次Minor GC后,PS GC會(huì)檢查此時(shí)舊生代的剩余空間是否
大于6MB,如小于,則觸發(fā)對(duì)舊生代的回收。
除了以上4種狀況外,對(duì)于使用RMI來(lái)進(jìn)行RPC或管理的Sun JDK應(yīng)用而言,默認(rèn)情況下會(huì)一小時(shí)執(zhí)行一次Full GC。可通過(guò)在啟動(dòng)時(shí)通過(guò)- java -
Dsun.rmi.dgc.client.gcInterval=3600000來(lái)設(shè)置Full GC執(zhí)行的間隔時(shí)間或通過(guò)-XX:+ DisableExplicitGC來(lái)禁止RMI調(diào)用System.gc。
所謂大對(duì)象,是指需要大量連續(xù)內(nèi)存空間的java對(duì)象,例如很長(zhǎng)的數(shù)組,此種對(duì)象會(huì)直接進(jìn)入老年代,而老年代雖然有很大的剩余空間,但是無(wú)法找到足夠大的連續(xù)空間來(lái)分配給當(dāng)前對(duì)象,此種情況就會(huì)觸發(fā)JVM進(jìn)行Full GC。
為了解決這個(gè)問(wèn)題,CMS垃圾收集器提供了一個(gè)可配置的參數(shù),即-XX:+UseCMSCompactAtFullCollection開(kāi)關(guān)參數(shù),用于在“享受”完Full GC服務(wù)之后額外免費(fèi)贈(zèng)送一個(gè)碎片整理的過(guò)程,內(nèi)存整理的過(guò)程無(wú)法并發(fā)的,空間碎片問(wèn)題沒(méi)有了,但提頓時(shí)間不得不變長(zhǎng)了,JVM設(shè)計(jì)者們還提供了另外一個(gè)參數(shù) -XX:CMSFullGCsBeforeCompaction,這個(gè)參數(shù)用于設(shè)置在執(zhí)行多少次不壓縮的Full GC后,跟著來(lái)一次帶壓縮的。
感謝各位的閱讀!關(guān)于“觸發(fā)JVM進(jìn)行Full GC的情況有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
文章題目:觸發(fā)JVM進(jìn)行FullGC的情況有哪些
標(biāo)題URL:http://chinadenli.net/article12/pgpidc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、企業(yè)網(wǎng)站制作、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)