使用jstack分析java程序cpu占用率過高的問題
創(chuàng)新互聯(lián)主要從事做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)茂南,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
1,使用jps查找出java進(jìn)程的pid,如3707
2,使用top -p 14292 -H觀察該進(jìn)程中所有線程的CPU占用。
[root@cp01-game-dudai-0100.cp01.baidu.com ~]# top -p 14292 -H top - 22:14:13 up 33 days, 7:29, 4 users, load average: 25.68, 32.11, 33.76 Tasks: 113 total, 2 running, 111 sleeping, 0 stopped, 0 zombie Cpu(s): 68.3%us, 6.3%sy, 0.0%ni, 20.2%id, 0.1%wa, 0.2%hi, 4.9%si, 0.0%st Mem: 65965312k total, 65451232k used, 514080k free, 82164k buffers Swap: 975864k total, 972052k used, 3812k free, 9714400k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 15844 root 15 0 6889m 5.7g 4864 S 20.6 9.1 814:13.29 java 15848 root 15 0 6889m 5.7g 4864 S 13.0 9.1 460:25.17 java 15611 root 15 0 6889m 5.7g 4864 S 12.7 9.1 468:17.77 java 15613 root 15 0 6889m 5.7g 4864 S 11.7 9.1 479:40.45 java 15743 root 15 0 6889m 5.7g 4864 S 11.7 9.1 443:04.80 java 15612 root 15 0 6889m 5.7g 4864 S 11.0 9.1 453:43.68 java 15965 root 15 0 6889m 5.7g 4864 S 10.3 9.1 371:00.33 java 15490 root 15 0 6889m 5.7g 4864 S 7.7 9.1 255:32.74 java 15587 root 15 0 6889m 5.7g 4864 S 7.3 9.1 282:27.58 java 15590 root 15 0 6889m 5.7g 4864 S 7.3 9.1 205:48.37 java 15491 root 15 0 6889m 5.7g 4864 R 6.3 9.1 279:09.08 java 15689 root 15 0 6889m 5.7g 4864 S 5.7 9.1 251:42.36 java 16935 root 15 0 6889m 5.7g 4864 S 5.7 9.1 190:34.37 java 15665 root 15 0 6889m 5.7g 4864 S 5.3 9.1 250:07.34 java 16920 root 15 0 6889m 5.7g 4864 S 5.3 9.1 241:34.50 java 15671 root 15 0 6889m 5.7g 4864 S 5.0 9.1 239:49.97 java 15492 root 15 0 6889m 5.7g 4864 S 4.7 9.1 210:23.09 java 14322 root 16 0 6889m 5.7g 4864 S 4.3 9.1 107:39.61 java 14316 root 16 0 6889m 5.7g 4864 S 4.0 9.1 107:18.43 java 14317 root 16 0 6889m 5.7g 4864 S 4.0 9.1 107:29.13 java 15591 root 15 0 6889m 5.7g 4864 S 4.0 9.1 114:34.90 java 14313 root 16 0 6889m 5.7g 4864 S 3.7 9.1 107:12.70 java 14314 root 15 0 6889m 5.7g 4864 S 3.7 9.1 107:28.05 java 14319 root 16 0 6889m 5.7g 4864 S 3.7 9.1 107:27.43 java 14321 root 15 0 6889m 5.7g 4864 S 3.3 9.1 108:01.12 java 15589 root 15 0 6889m 5.7g 4864 R 3.0 9.1 109:01.91 java 15615 root 15 0 6889m 5.7g 4864 S 3.0 9.1 114:55.29 java 16808 root 15 0 6889m 5.7g 4864 S 2.7 9.1 279:05.03 java 14315 root 15 0 6889m 5.7g 4864 S 2.0 9.1 107:45.00 java 14320 root 15 0 6889m 5.7g 4864 S 2.0 9.1 107:48.30 java 15489 root 15 0 6889m 5.7g 4864 S 1.7 9.1 57:38.46 java 15670 root 15 0 6889m 5.7g 4864 S 1.3 9.1 5:55.43 java 14318 root 15 0 6889m 5.7g 4864 S 0.7 9.1 107:45.88 java 14826 root 15 0 6889m 5.7g 4864 S 0.7 9.1 25:07.64 java
3,找出CPU消耗較多的線程id,如15844,將15844轉(zhuǎn)換為16進(jìn)制0x3de4,注意是小寫哦
4,使用jstack 14292|grep -A 10 0x3de4來查詢出具體的線程狀態(tài)。
[root@cp01-game-dudai-0100.cp01.baidu.com ~]# jstack 14292|grep -A 10 0x3de4 "pool-52-thread-1" prio=10 tid=0x000000005a08e000 nid=0x3de4 waiting on condition [0x00002ae63d917000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000006f9a0a110> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662)
通過這些線程狀態(tài)便可基本定位問題之所在。
解決辦法:
方法1
1.jps 獲取Java進(jìn)程的PID。
2.jstack pid >> java.txt 導(dǎo)出CPU占用高進(jìn)程的線程棧。
3.top -H -p PID 查看對應(yīng)進(jìn)程的哪個線程占用CPU過高。
4.echo “obase=16; PID” | bc 將線程的PID轉(zhuǎn)換為16進(jìn)制,大寫轉(zhuǎn)換為小寫。
5.在第二步導(dǎo)出的Java.txt中查找轉(zhuǎn)換成為16進(jìn)制的線程PID。找到對應(yīng)的線程棧。
6.分析負(fù)載高的線程棧都是什么業(yè)務(wù)操作。優(yōu)化程序并處理問題。
方法2
1.使用top 定位到占用CPU高的進(jìn)程PID
top
通過ps aux | grep PID命令
2.獲取線程信息,并找到占用CPU高的線程
ps -mp pid -o THREAD,tid,time | sort -rn
3.將需要的線程ID轉(zhuǎn)換為16進(jìn)制格式
printf "%x\n" tid
4.打印線程的堆棧信息
jstack pid |grep tid -A 30
總結(jié)
以上就是本文關(guān)于java應(yīng)用cpu占用過高問題分析及解決方法的全部內(nèi)容,希望對大家有所幫助,如果有什么疑問,可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對創(chuàng)新互聯(lián)網(wǎng)站的支持。
分享題目:java應(yīng)用cpu占用過高問題分析及解決方法
文章起源:http://aaarwkj.com/article6/gppiog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、微信小程序、標(biāo)簽優(yōu)化、App開發(fā)、動態(tài)網(wǎng)站、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)