Java进程CPU使用率高排查
2017-12-28 14:01
162 查看
近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下。
方法一:
转载:http://www.linuxhot.com/java-cpu-used-high.html
1.jps 获取Java进程的PID。
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
方法二:
1.使用top 定位到占用CPU高的进程PID
top
通过ps aux | grep PID命令
2.获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf “%x\n” tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
通过第一种方法找到如下线程堆栈信息pid
分析其原因是因为程序中含有全局变量引用,导致JVM虚拟机回收线程收集不引用对象不够。
主要是对JVM的成员变量存储位置不是很清楚,比如说静态变量等等之类的,程序全部修改了一遍,部署之后,tomcat占用的进程明显降下来了
之前占用CPU可能达到百分之三四百,好吓人!
方法一:
转载:http://www.linuxhot.com/java-cpu-used-high.html
1.jps 获取Java进程的PID。
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
方法二:
1.使用top 定位到占用CPU高的进程PID
top
通过ps aux | grep PID命令
2.获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf “%x\n” tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
通过第一种方法找到如下线程堆栈信息pid
"VM Thread" prio=10 tid=0x00007fb5ec070000 nid=0x492d runnable "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fb5ec01a000 nid=0x4923 runnable "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fb5ec01b800 nid=0x4924 runnable "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fb5ec01d800 nid=0x4925 runnable "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fb5ec01f800 nid=0x4926 runnable "GC task thread#4 (ParallelGC)" prio=10 tid=0x00007fb5ec021000 nid=0x4927 runnable "GC task thread#5 (ParallelGC)" prio=10 tid=0x00007fb5ec023000 nid=0x4928 runnable "GC task thread#6 (ParallelGC)" prio=10 tid=0x00007fb5ec025000 nid=0x4929 runnable "GC task thread#7 (ParallelGC)" prio=10 tid=0x00007fb5ec026800 nid=0x492a runnable "GC task thread#8 (ParallelGC)" prio=10 tid=0x00007fb5ec028800 nid=0x492b runnable "GC task thread#9 (ParallelGC)" prio=10 tid=0x00007fb5ec02a800 nid=0x492c runnable "VM Periodic Task Thread" prio=10 tid=0x00007fb5ec0af000 nid=0x4934 waiting on condition JNI global references: 956
分析其原因是因为程序中含有全局变量引用,导致JVM虚拟机回收线程收集不引用对象不够。
主要是对JVM的成员变量存储位置不是很清楚,比如说静态变量等等之类的,程序全部修改了一遍,部署之后,tomcat占用的进程明显降下来了
之前占用CPU可能达到百分之三四百,好吓人!
相关文章推荐
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程CPU使用率高排查
- Java进程内存占用高排查小结
- java.exe进程来源排查录
- 生产环境下JAVA进程高CPU占用故障排查
- 记一次java进程被linux杀掉的排查过程
- 生产环境下JAVA进程高CPU占用故障排查
- 生产环境下JAVA进程高CPU占用故障排查
- java问题排查工具之一板斧jstack——使用 jstack 定位 java进程CPU过高的问题
- JAVA进程高CPU占用故障排查