Java Web應用Load飆高排查思路

1、使用uptime查看當前load,發現load飆高。

?  ~ uptime
13:29  up 23:41, 3 users, load averages: 10 10 10

2、使用top命令,查看占用CPU較高的進程ID。

?  ~ top
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1893 admin     20   0 7127m 2.6g  38m S 181.7 32.6  10:20.26 java

發現PID為1893的進程占用CPU 181%。而且是一個Java進程,基本斷定是軟件問題。

3、使用 top命令,查看具體是哪個線程占用率較高

?  ~ top -Hp 1893
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4519 admin     20   0 7127m 2.6g  38m R 18.6 32.6   0:40.11 java

4、使用printf命令查看這個線程的16進制

?  ~ printf %x 4519

11a7
5、使用jstack命令查看當前線程正在執行的方法。

?  ~ jstack 1893 |grep -A 200 11a7
"thread-5" #500 daemon prio=10 os_prio=0 tid=0x00007f632314a800 nid=0x11a2 runnable [0x000000005442a000]
java.lang.Thread.State: RUNNABLE
at sun.misc.URLClassPath$Loader.findResource(URLClassPath.java:684)
at sun.misc.URLClassPath.findResource(URLClassPath.java:188)
at java.net.URLClassLoader$2.run(URLClassLoader.java:569)
at java.net.URLClassLoader$2.run(URLClassLoader.java:567)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findResource(URLClassLoader.java:566)
at org.hibernate.validator.internal.xml.ValidationXmlParser.getInputStreamForPath(ValidationXmlParser.java:248)
at com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30)

從上面的線程的棧日志中,可以發現,當前占用CPU較高的線程正在執行我代碼的com.hollis.test.util.BeanValidator.validate(BeanValidator.java:30) 類。那么就可以去排查這個類是否用法有問題了。
6、還可以使用jstat來查看GC情況,看看是否有頻繁FGC,然后再使用jmap來dump內存,查看是否存在內存泄露。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容