java应用cpu占用过高问题分析及解决方法
使用jstack分析java程序cpu占用率过高的问题
1,使用jps查找出java进程的pid,如3707
2,使用top-p14292-H观察该进程中所有线程的CPU占用。
[root@cp01-game-dudai-0100.cp01.baidu.com~]#top-p14292-H top-22:14:13up33days,7:29,4users,loadaverage:25.68,32.11,33.76 Tasks:113total,2running,111sleeping,0stopped,0zombie 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:65965312ktotal,65451232kused,514080kfree,82164kbuffers Swap:975864ktotal,972052kused,3812kfree,9714400kcached PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND 15844root1506889m5.7g4864S20.69.1814:13.29java 15848root1506889m5.7g4864S13.09.1460:25.17java 15611root1506889m5.7g4864S12.79.1468:17.77java 15613root1506889m5.7g4864S11.79.1479:40.45java 15743root1506889m5.7g4864S11.79.1443:04.80java 15612root1506889m5.7g4864S11.09.1453:43.68java 15965root1506889m5.7g4864S10.39.1371:00.33java 15490root1506889m5.7g4864S7.79.1255:32.74java 15587root1506889m5.7g4864S7.39.1282:27.58java 15590root1506889m5.7g4864S7.39.1205:48.37java 15491root1506889m5.7g4864R6.39.1279:09.08java 15689root1506889m5.7g4864S5.79.1251:42.36java 16935root1506889m5.7g4864S5.79.1190:34.37java 15665root1506889m5.7g4864S5.39.1250:07.34java 16920root1506889m5.7g4864S5.39.1241:34.50java 15671root1506889m5.7g4864S5.09.1239:49.97java 15492root1506889m5.7g4864S4.79.1210:23.09java 14322root1606889m5.7g4864S4.39.1107:39.61java 14316root1606889m5.7g4864S4.09.1107:18.43java 14317root1606889m5.7g4864S4.09.1107:29.13java 15591root1506889m5.7g4864S4.09.1114:34.90java 14313root1606889m5.7g4864S3.79.1107:12.70java 14314root1506889m5.7g4864S3.79.1107:28.05java 14319root1606889m5.7g4864S3.79.1107:27.43java 14321root1506889m5.7g4864S3.39.1108:01.12java 15589root1506889m5.7g4864R3.09.1109:01.91java 15615root1506889m5.7g4864S3.09.1114:55.29java 16808root1506889m5.7g4864S2.79.1279:05.03java 14315root1506889m5.7g4864S2.09.1107:45.00java 14320root1506889m5.7g4864S2.09.1107:48.30java 15489root1506889m5.7g4864S1.79.157:38.46java 15670root1506889m5.7g4864S1.39.15:55.43java 14318root1506889m5.7g4864S0.79.1107:45.88java 14826root1506889m5.7g4864S0.79.125:07.64java
3,找出CPU消耗较多的线程id,如15844,将15844转换为16进制0x3de4,注意是小写哦
4,使用jstack14292|grep-A100x3de4来查询出具体的线程状态。
[root@cp01-game-dudai-0100.cp01.baidu.com~]#jstack14292|grep-A100x3de4 "pool-52-thread-1"prio=10tid=0x000000005a08e000nid=0x3de4waitingoncondition[0x00002ae63d917000] java.lang.Thread.State:WAITING(parking) atsun.misc.Unsafe.park(NativeMethod) -parkingtowaitfor<0x00000006f9a0a110>(ajava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) atjava.util.concurrent.locks.LockSupport.park(LockSupport.java:156) atjava.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987) atjava.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399) atjava.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) atjava.lang.Thread.run(Thread.java:662)
通过这些线程状态便可基本定位问题之所在。
解决办法:
方法1
1.jps获取Java进程的PID。
2.jstackpid>>java.txt导出CPU占用高进程的线程栈。
3.top-H-pPID查看对应进程的哪个线程占用CPU过高。
4.echo“obase=16;PID”|bc将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
方法2
1.使用top定位到占用CPU高的进程PID
top
通过psaux|grepPID命令
2.获取线程信息,并找到占用CPU高的线程
ps-mppid-oTHREAD,tid,time|sort-rn
3.将需要的线程ID转换为16进制格式
printf"%x\n"tid
4.打印线程的堆栈信息
jstackpid|greptid-A30
总结
以上就是本文关于java应用cpu占用过高问题分析及解决方法的全部内容,希望对大家有所帮助,如果有什么疑问,可以随时留言,小编会及时回复大家的。感谢朋友们对毛票票网站的支持。