有個java程序越跑越慢,如何排查?
首先通過jps找到java進程ID。然后top -p [pid]發現內存占用達到了最大值(-Xmx)。開始懷疑是由於頻繁Full GC導致的,於是通過jstat -gcutil [pid] 60000查看GC的情況,其中60000表示每隔1分鍾輸出一次。果然是Full GC次數太多,JVM大部分時間都進行Full GC,而此時JVM會暫停其他一切工作,所以程序運行得非常慢。
那到底的程序的哪一部分導致消耗了這么多的內存呢?通過jmap -histo:live [pid]查看進程中各種類型的對象創建了多少個,以及每種類型的對象占多少內存。當我看到有個對象被創建了5千多萬個實例時,我就能定位到是哪兒的問題了。
順帶說一下,通過jmap還可以生成JVM的內存dump文件,命令為jmap -dump:format=b,file=文件名 [pid],然后通過jhat命令在瀏覽器中查看,或者通過jvisualvm、eclipse memory analyzer等工具進行查看。使用jhat命令查看的方式為:jhat -J-Xmx1024M [file],等控制台輸出Started HTTP server on port 7000. Server is ready.后在瀏覽器中輸入ip:7000就可以查看各上類中各種實例被創建了多少個。