歡迎光臨
每天分享高質量文章

Java 記憶體上限溢位排查

(點選上方公眾號,可快速關註)


來源:Loh ,

saboloh.com/2018/07/05/java-detecting-out-of-memory-errors/

Java OOM 毫無疑問是開發人員常見並且及其痛恨的問題,但是任何服務的開發都沒法避免 OOM。 因此,OOM 的排查及定位是每個 Java 工程師都必備的技能。

所遇到的問題

在使用 scala 開發的一個 web 服務,在使用者使用中,經常出現: java.lang.OutOfMemoryError: Java heap space 。而且還束手無策,每次都只能重啟服務解決。

準備

服務使用 jetty 釋出的,先來看一下我這個服務的啟動引數:

/opt/soft/jdk/jdk1.7.0_40/bin/java \

  -server -Xmx4G -XX:MaxPermSize=1024M -XX:PermSize=256M \

  -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-CMSConcurrentMTEnabled -XX:CMSInitiatingOccupancyFraction=65 -XX:+CMSParallelRemarkEnabled \

  -XX:+HeapDumpOnOutOfMemoryError \

  -XX:HeapDumpPath=/opt/soft/heapdump/ \

  -Dscala.concurrent.context.numThreads=500 \

  -Dscala.concurrent.context.maxThreads=500 \

  -Dfile.encoding=UTF-8 -jar start.jar >> log 2>&1 &

排查

透過增加了引數 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath 當在 OOM 的時候,服務會生成一個 java_pid$pid.hprof 二進位制檔案。

下麵就是使用工具分析這個 .hprof 檔案來定位問題了。使用 Memory Analyzer (MAT) 來分析該檔案,效果如下:


效果很嚇人,什麼鬼,什麼東西,吃了 3.8G 的記憶體,我#%$#@#@#&^&^
<

贊(0)

分享創造快樂