在過去做性能測試過程中經常看到1小時1次fgc問題,該問題在高并發情況下對性能産生很大的波動不可小看,也許一個小小的調優可以給性能帶來很大的改善。
應用出現1小時1次fgc,所引發的原因是由于使用了rmi,會自動1小時調用1次system.gc()。
大多數的應用雖然配置了cms gc方式,但是如果沒有使用-xx:+explicitgcinvokesconcurrent,則會出現顯示調用system.gc(),且不會進行 cms的fgc,帶來的影響是造成tps的波動(fgc停機時間越長,則波動會越大)。
收集各方的意見後,總結針對此類問題的解決方法如下:
1、增加參數 -xx:+disableexplicitgc
該方法system.gc()的調用就會變成一個空調用。但是該方法不适用在大量使用nio的direct memory,經常、反複的申請directbytebuffer的應用中使用,會造成“java.lang.outofmemoryerror: direct buffer memory ”。該方法需根據應用具體情況而定。
2、增加參數 -dsun.rmi.dgc.client.gcinterval=3600000 -dsun.rmi.dgc.server.gcinterval=3600000
其中3600000即為定時觸發的時間間隔設定,機關是毫秒,可适當延長觸發fgc的定時時間間隔。
-dsun.rmi.dgc.client.gcinterval=long.max_value -dsun.rmi.dgc.server.gcinterval=long.max_value 則将fc時間間隔設為long型的最大值
3、增加參數 -xx:+explicitgcinvokesconcurrent 或者-xx:+explicitgcinvokesconcurrentandunloadsclasses
該方法可以指定system.gc()采用 cms 算法,fgc時停機時間會變短,但是cms gc次數不會變,仍然是1小時1次。
原創作品,轉載時請務必以超連結形式标明本文原始出處、作者資訊和本聲明,否則将追究法律責任。