java程序cpu占用率高,分析具体线程
? 今天將數據轉發程序移植到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 javaourgroup 23912 2.6 5.3 998908 54464 ? Sl 14:45 8:31 java com.thingcom.mainServer.MainServerourgroup 29226 0.7 7.7 1123176 79160 ? Sl Apr27 82:30 java org.huigher.server.Serverourgroup 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得到具體的某個進程,進行定位
? ? ? ? ? ? ?通過定位發現原來是我在某個線程中,進入while語句后,判斷語句為false,沒有進行sleep。導致該線程一直占用cpu,所以導致了cpu占用率高的現象,該現象值得注意。
? ??
? ? ? ? ? ? 主要借鑒大牛blog: ? ? ? http://blog.csdn.net/huaishu/article/details/9219141
總結
以上是生活随笔為你收集整理的java程序cpu占用率高,分析具体线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矩形膜的格林函数
- 下一篇: 关于处理npm ERR! Unexpec