jvm什么時(shí)候會(huì)觸發(fā)full gc?
jvm什么時(shí)候會(huì)觸發(fā)full gc?
除直接調(diào)用System.gc外,觸發(fā)FullGC執(zhí)行的情況有如下四種。1.舊生代空間不足舊生代空間只有在新生代對(duì)象轉(zhuǎn)入及創(chuàng)建為大對(duì)象、大數(shù)組時(shí)才會(huì)出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行FullGC后空間仍然不足,則拋出如下錯(cuò)誤:java.lang.OutOfMemoryError:Javaheapspace為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時(shí)應(yīng)盡量做到讓對(duì)象在MinorGC階段被回收、讓對(duì)象在新生代多存活一段時(shí)間及不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組。2.PermanetGeneration空間滿(mǎn)PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類(lèi)、反射的類(lèi)和調(diào)用的方法較多時(shí),PermanetGeneration可能會(huì)被占滿(mǎn),在未配置為采用CMSGC的情況下會(huì)執(zhí)行FullGC
導(dǎo)讀除直接調(diào)用System.gc外,觸發(fā)FullGC執(zhí)行的情況有如下四種。1.舊生代空間不足舊生代空間只有在新生代對(duì)象轉(zhuǎn)入及創(chuàng)建為大對(duì)象、大數(shù)組時(shí)才會(huì)出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行FullGC后空間仍然不足,則拋出如下錯(cuò)誤:java.lang.OutOfMemoryError:Javaheapspace為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時(shí)應(yīng)盡量做到讓對(duì)象在MinorGC階段被回收、讓對(duì)象在新生代多存活一段時(shí)間及不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組。2.PermanetGeneration空間滿(mǎn)PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類(lèi)、反射的類(lèi)和調(diào)用的方法較多時(shí),PermanetGeneration可能會(huì)被占滿(mǎn),在未配置為采用CMSGC的情況下會(huì)執(zhí)行FullGC
![](https://img.51dongshi.com/20241130/wz/18297596452.jpg)
除直接調(diào)用System.gc外,觸發(fā)Full GC執(zhí)行的情況有如下四種。 1. 舊生代空間不足 舊生代空間只有在新生代對(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 為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時(shí)應(yīng)盡量做到讓對(duì)象在Minor GC階段被回收、讓對(duì)象在新生代多存活一段時(shí)間及不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組。 2. Permanet Generation空間滿(mǎn) PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類(lèi)、反射的類(lèi)和調(diào)用的方法較多時(shí),Permanet Generation可能會(huì)被占滿(mǎn),在未配置為采用CMS GC的情況下會(huì)執(zhí)行Full GC。如果經(jīng)過(guò)Full GC仍然回收不了,那么JVM會(huì)拋出如下錯(cuò)誤信息: java.lang.OutOfMemoryError: PermGen space 為避免Perm Gen占滿(mǎn)造成Full GC現(xiàn)象,可采用的方法為增大Perm Gen空間或轉(zhuǎn)為使用CMS GC。 3. CMS GC時(shí)出現(xiàn)promotion failed和concurrent mode failure 對(duì)于采用CMS進(jìn)行舊生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當(dāng)這兩種狀況出現(xiàn)時(shí)可能會(huì)觸發(fā)Full GC。 promotionfailed是在進(jìn)行Minor GC時(shí),survivor space放不下、對(duì)象只能放入舊生代,而此時(shí)舊生代也放不下造成的;concurrent mode failure是在執(zhí)行CMS GC的過(guò)程中同時(shí)有對(duì)象要放入舊生代,而此時(shí)舊生代空間不足造成的。 應(yīng)對(duì)措施為:增大survivorspace、舊生代空間或調(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)避免。 4. 統(tǒng)計(jì)得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間 這是一個(gè)較為復(fù)雜的觸發(fā)情況,Hotspot為了避免由于新生代對(duì)象晉升到舊生代導(dǎo)致舊生代空間不足的現(xiàn)象,在進(jìn)行Minor GC時(shí),做了一個(gè)判斷,如果之前統(tǒng)計(jì)所得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間,那么就直接觸發(fā)Full GC。 例如程序第一次觸發(fā)MinorGC后,有6MB的對(duì)象晉升到舊生代,那么當(dāng)下一次Minor GC發(fā)生時(shí),首先檢查舊生代的剩余空間是否大于6MB,如果小于6MB,則執(zhí)行Full GC。 當(dāng)新生代采用PSGC時(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。
jvm什么時(shí)候會(huì)觸發(fā)full gc?
除直接調(diào)用System.gc外,觸發(fā)FullGC執(zhí)行的情況有如下四種。1.舊生代空間不足舊生代空間只有在新生代對(duì)象轉(zhuǎn)入及創(chuàng)建為大對(duì)象、大數(shù)組時(shí)才會(huì)出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行FullGC后空間仍然不足,則拋出如下錯(cuò)誤:java.lang.OutOfMemoryError:Javaheapspace為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時(shí)應(yīng)盡量做到讓對(duì)象在MinorGC階段被回收、讓對(duì)象在新生代多存活一段時(shí)間及不要?jiǎng)?chuàng)建過(guò)大的對(duì)象及數(shù)組。2.PermanetGeneration空間滿(mǎn)PermanetGeneration中存放的為一些class的信息等,當(dāng)系統(tǒng)中要加載的類(lèi)、反射的類(lèi)和調(diào)用的方法較多時(shí),PermanetGeneration可能會(huì)被占滿(mǎn),在未配置為采用CMSGC的情況下會(huì)執(zhí)行FullGC
為你推薦