java gc full gc_Java中full gc什么意思?
慕雪6442864
除直接調(diào)用System.gc外,觸發(fā)Full GC執(zhí)行的情況有如下四種。1. 舊生代空間不足舊生代空間只有在新生代對象轉入及創(chuàng)建為大對象、大數(shù)組時才會出現(xiàn)不足的現(xiàn)象,當執(zhí)行Full GC后空間仍然不足,則拋出如下錯誤:java.lang.OutOfMemoryError: Java heap space為避免以上兩種狀況引起的FullGC,調(diào)優(yōu)時應盡量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創(chuàng)建過大的對象及數(shù)組。2. Permanet Generation空間滿PermanetGeneration中存放的為一些class的信息等,當系統(tǒng)中要加載的類、反射的類和調(diào)用的方法較多時,Permanet Generation可能會被占滿,在未配置為采用CMS GC的情況下會執(zhí)行Full GC。如果經(jīng)過Full GC仍然回收不了,那么JVM會拋出如下錯誤信息:java.lang.OutOfMemoryError: PermGen space為避免Perm Gen占滿造成Full GC現(xiàn)象,可采用的方法為增大Perm Gen空間或轉為使用CMS GC。3. CMS GC時出現(xiàn)promotion failed和concurrent mode failure對于采用CMS進行舊生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure兩種狀況,當這兩種狀況出現(xiàn)時可能會觸發(fā)Full GC。promotionfailed是在進行Minor GC時,survivor space放不下、對象只能放入舊生代,而此時舊生代也放不下造成的;concurrent mode failure是在執(zhí)行CMS GC的過程中同時有對象要放入舊生代,而此時舊生代空間不足造成的。應對措施為:增大survivorspace、舊生代空間或調(diào)低觸發(fā)并發(fā)GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由于JDK的bug29導致CMS在remark完畢后很久才觸發(fā)sweeping動作。對于這種狀況,可通過設置-XX:CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。4. 統(tǒng)計得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間這是一個較為復雜的觸發(fā)情況,Hotspot為了避免由于新生代對象晉升到舊生代導致舊生代空間不足的現(xiàn)象,在進行Minor GC時,做了一個判斷,如果之前統(tǒng)計所得到的Minor GC晉升到舊生代的平均大小大于舊生代的剩余空間,那么就直接觸發(fā)Full GC。例如程序第一次觸發(fā)MinorGC后,有6MB的對象晉升到舊生代,那么當下一次Minor GC發(fā)生時,首先檢查舊生代的剩余空間是否大于6MB,如果小于6MB,則執(zhí)行Full GC。當新生代采用PSGC時,方式稍有不同,PS GC是在Minor GC后也會檢查,例如上面的例子中第一次Minor GC后,PS GC會檢查此時舊生代的剩余空間是否大于6MB,如小于,則觸發(fā)對舊生代的回收。除了以上4種狀況外,對于使用RMI來進行RPC或管理的Sun JDK應用而言,默認情況下會一小時執(zhí)行一次Full GC。可通過在啟動時通過- java-Dsun.rmi.dgc.client.gcInterval=3600000來設置Full GC執(zhí)行的間隔時間或通過-XX:+ DisableExplicitGC來禁止RMI調(diào)用System.gc。
總結
以上是生活随笔為你收集整理的java gc full gc_Java中full gc什么意思?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南昌治疗男人精子活力低最好的医院推荐
- 下一篇: java 编程原理_Java网络编程 -