发现异常
在新版本发布后,需要关注CPU使用情况、GC情况。
-
top -c
查看CPU、内存、系统负载等运行状态
-
jstat -gc pid 10000
查看GC情况,每隔10S执行一次。
当发现CPU占用过高、系统负载过高、GC次数过多时,则认为当前存在异常
异常线程
-
使用
top -c,然后按P按照CPU使用率排序 -
使用
top -Hp pid,然后按P按照CPU使用率排序-H:显示线程信息-p:指定进程pid -
这里显示的线程ID是十进制,需要转换成十六进制。
线程信息
-
使用
jstack -l pid > ./pid.stack把栈信息转换成文件可以使用
jstack -l pid > ./pid.dump设置成dump文件,可以借助于笨马平台进行线程分析 -
使用
cat pid.stack |grep 'b26' -C 8查看栈信息过滤的线程ID使用的是十六进制
-
也可以把dump文件上传到笨马平台上分析

-
cat的线程信息,举例:
"my-thread-7" #18 prio=5 os_prio=0 tid=0x0000000020c69800 nid=0x3374 runnable [0x0000000021f5e000] java.lang.Thread.State: RUNNABLE at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:326) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) - locked <0x00000006c1c1bb90> (a java.io.BufferedOutputStream) at java.io.PrintStream.write(PrintStream.java:482) - locked <0x00000006c1c14170> (a java.io.PrintStream) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104) - locked <0x00000006c1c1bba8> (a java.io.OutputStreamWriter) at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185) at java.io.PrintStream.newLine(PrintStream.java:546) - eliminated <0x00000006c1c14170> (a java.io.PrintStream) at java.io.PrintStream.println(PrintStream.java:807) - locked <0x00000006c1c14170> (a java.io.PrintStream) at com.security.im.controller.login.Test.lambda$main$0(Test.java:56) at com.security.im.controller.login.Test?Lambda$1/1807837413.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - <0x00000006c1c1bbf0> (a java.util.concurrent.ThreadPoolExecutor$Worker)