依賴包濫用System.gc()導(dǎo)致的頻繁Full GC
簡書 滌生铃辖。
轉(zhuǎn)載請注明原創(chuàng)出處厦瓢,謝謝凉馆!
如果讀完覺得有收獲的話蝶锋,歡迎點(diǎn)贊加關(guān)注涨享。
介紹
業(yè)務(wù)部門的一個(gè)同事遇到個(gè)奇怪的Full GC問題吟秩,有個(gè)服務(wù)遷移到新的應(yīng)用后,一直頻繁Full GC。新應(yīng)用機(jī)器的配置是4c 8g企量,老應(yīng)用是4c 4g测萎,老應(yīng)用GC都很正常,并且代碼沒有變更梁钾,所以比較奇怪绳泉。
現(xiàn)象
問題的現(xiàn)象是逊抡,從監(jiān)控圖上看一直有大量的Full GC排查
遇到這個(gè)問題姆泻,一般都是先看看各個(gè)區(qū)的內(nèi)存占用情況:從監(jiān)控圖上看Old Gen、Young Gen冒嫡、Perm Gen拇勃,沒什么問題,不會觸發(fā)Full GC孝凌,當(dāng)然這里看各個(gè)Gen是否會觸發(fā)Full GC需要結(jié)合JVM參數(shù)配置來看方咆。
順便也看了下GC日志,一直狂暴CMS GC日志蟀架,而且可以看到老年代使用空間也不大瓣赂,細(xì)心可以發(fā)現(xiàn)片拍,大量的CMS GC中夾雜著Young煌集、Perm區(qū)的回收,所以其實(shí)是Full GC捌省。GC日志如下:通過上面的觀察苫纤,再根據(jù)一般觸發(fā)CMS GC幾個(gè)可能性:
- Old Gen使用達(dá)到一定的比率,默認(rèn)為92%纲缓,這里看CMSInitiatingOccupancyFraction=80%卷拘,而實(shí)際才使用2%(看監(jiān)控圖表)不到,所以排除這種情況祝高。
- 配置了CMSClassUnloadingEnabled栗弟,且Perm Gen的使用達(dá)到一定的比率默認(rèn)為92%,這里看CMSInitiatingPermOccupancyFraction=80%工闺,而實(shí)際才使用30%(看監(jiān)控圖表)不到横腿,所以排除這種情況。
- 配置了ExplictGCInvokesConcurrent且未配置DisableExplicitGC的情況下顯示調(diào)用了System.gc()斤寂。
- Hotspot自己根據(jù)估計(jì)決定是否要觸法耿焊,如CMS悲觀策略,這類可以通過GC日志分析遍搞。
大致判斷很可能是System.gc()導(dǎo)致的問題罗侯,但是怎么定位調(diào)用System.gc()的代碼呢?
jstack作用非常大讲弄,很多問題都能從這里發(fā)現(xiàn)措左,而且比較輕量,對應(yīng)用基本無影響避除。某次的jstack信息只代表那個(gè)時(shí)刻的線程堆棧怎披,有時(shí)只看一個(gè)jstack信息可能看不出什么問題,一般可以多jstack幾次瓶摆,然后對比去看凉逛,基本就能發(fā)現(xiàn)一些問題。
(當(dāng)然該問題群井,也可能不是頻繁的Full GC状飞,可能通過jstack定位不到問題,可以jstat -gccause pid 1000书斜,來查看gc原因诬辈。)
很明顯,是由于jxl這個(gè)包中的close方法顯示調(diào)用了System.gc()導(dǎo)致的問題荐吉。
跟了下代碼焙糟,自然確實(shí)存在這段代碼,不過有個(gè)設(shè)置開關(guān)稍坯,可以disable這個(gè)功能酬荞,所以在使用的時(shí)候可以設(shè)置setGCDisabled(true),關(guān)閉觸發(fā)System.gc()瞧哟。但是為什么老應(yīng)用沒有問題呢混巧,主要是因?yàn)樗?-XX:+DisableExplicitGC,屏蔽了System.gc()動作勤揩,新應(yīng)用的JVM沒有這個(gè)配置咧党。
可能大家還有個(gè)疑問,都知道System.gc()會觸發(fā)Full GC陨亡,那為什么一直進(jìn)行CMS GC(通過GC日志)呢傍衡?
主要是因?yàn)檫@個(gè)參數(shù)-XX:+ExplicitGCInvokesConcurrent,打開此參數(shù)后负蠕,會做并行Full GC蛙埂,只有配置-XX:+UseConcMarkSweepGC這個(gè)參數(shù),該參數(shù)才會生效遮糖。因此绣的,System.gc()時(shí)Old區(qū)會進(jìn)行CMS GC,可提高Full GC效率。
總結(jié)
盡量減少顯示使用System.gc()來觸發(fā)Full GC屡江,這會導(dǎo)致頻繁Full GC芭概,非常影響應(yīng)用性能。