今天将数据转发程序移植到LINUX服务器上,启动程序后,通过PP |grep java 发现程序占用了CPU固定在95%左右,并且一直没有下降,而是一直保持在这么一个高 度。顿时就慌了,关键第一次遇到类似的问题,并且感觉程序应该挺完善的。不应该出现这个问题。
遇到问题就要进行解决,通过查找资料,借鉴前人经验,出现占用率这么高的状态主要原因有:
1.程序计算比较密集
2.程序死循
3.程序逻请求堵塞
排查方案:
(1). 首先dump出该程序进程的所有线程及其状
通过命令:ps | grep java得到该程序的进程pid
<pre name="code" class="plain"> ourgroup@iZ23gyf9teeZ:/home/zxf$ ps auwx |grep java
ourgroup 23912 2.6 5.3 998908 54464 ? Sl 14:45 8:31 java com.thingcom.mainServer.MainServer
ourgroup 29226 0.7 7.7 1123176 79160 ? Sl Apr27 82:30 java org.huigher.server.Server
ourgroup 29783 0.0 0.0 11744 900 pts/0 S+ 20:04 0:00 grep java
使用命令jstack PID 重定向输出CPU占用过高的进程的线程栈。
ourgroup@iZ23gyf9teeZ:~/upload/thingcomSrv$ jstack 23912 > 23912.stack
(2). 使用TOP命令得到实时线程占用量:
使用top -H -p PID 命令查看对应进程是哪个线程占用CPU过高.
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
23939 ourgroup 20 0 999936 55388 10968 R 0.7 5.5 2:19.62 java
23934 ourgroup 20 0 999936 55388 10968 R 0.3 5.5 2:19.32 java
23937 ourgroup 20 0 999936 55388 10968 R 0.3 5.5 2:19.64 java
23938 ourgroup 20 0 999936 55388 10968 R 0.3 5.5 2:19.63 java
23912 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23915 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.78 java
23917 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.46 java
23918 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23919 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23920 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23921 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.32 java
23922 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.24 java
23923 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23924 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:08.15 java
23926 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23927 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.14 java
23928 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.16 java
23929 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.23 java
23930 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.20 java
23932 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
23933 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 1:09.98 java
23935 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 1:03.29 java
23936 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.14 java
23940 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 1:02.99 java
29882 ourgroup 20 0 999936 55388 10968 S 0.0 5.5 0:00.00 java
这是我改过程序以后查看的结果,所以占用率不高,可以以PID:23934进行举例说明,如何查看具体某个进程
(3). 将PID转换成十六进制: 23934 =0x7d5e
(4) . 进入最开始导入的32912进程的线程栈文件:23912.stack; 然后通过查找十六进制PID得到具体的某个进程,进行定位
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.thingcom.netgate.NetgateAcceptDispatcherThread.run(NetgateAcceptDispatcherThread.java:38)
at java.lang.Thread.run(Thread.java:722)
通过定位发现原来是我在某个线程中,进入while语句后,判断语句为false,没有进行sleep。导致该线程一直占用cpu,所以导致了cpu占用率高的现象,该现象值得注意。
主要借鉴大牛blog: http://blog.csdn.net/huaishu/article/details/9219141