您的位置:首页 > 编程语言 > Java开发

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

"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可能达到百分之三四百,好吓人!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: