java进程CPU高分析

https://blog.csdn.net/moranzi1/article/details/89341480

JVM导致系统CPU高的常见场景
内存不足,JVM gc频繁,一般会伴随OOM
JVM某个线程死循环或者递归调用

定位和解决
1.内存不足,gc频繁可参考我的这遍文章解决。https://blog.csdn.net/moranzi1/article/details/88670204
2.JVM某个线程死循环或者递归调用。这种情况关键是找到导致CPU高的线程。然后根据具体线程具体分析为什么该线程会导致CPU高。需要线程的步骤如下。

top——命令查看cpu高的进程
[[email protected] syp]# top
top - 11:58:57 up 84 days, 15:19, 6 users, load average: 4.59, 4.16, 3.26
Tasks: 262 total, 1 running, 261 sleeping, 0 stopped, 0 zombie
%Cpu(s): 84.1 us, 4.5 sy, 0.0 ni, 10.8 id, 0.1 wa, 0.0 hi, 0.6 si, 0.0 st
KiB Mem : 16266412 total, 198808 free, 15154212 used, 913392 buff/cache
KiB Swap: 1049596 total, 16848 free, 1032748 used. 460116 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12107 root 20 0 4528084 978784 7384 S 293.0 6.0 68:23.05 java
16699 root 20 0 4281608 514176 0 S 15.9 3.2 11778:45 java
8193 root 20 0 4349112 813096 0 S 12.0 5.0 12573:55 java
30793 root 20 0 4405120 855476 7336 S 2.3 5.3 8:16.27 java
10230 root 20 0 4508844 781092 7192 S 2.0 4.8 6:26.20 java
17192 root 10 -10 137084 12684 2508 S 2.0 0.1 696:57.96 AliYunDun

ps aux | grep PID——命令查看具体进程信息

ps -mp pid -o THREAD,tid,time——命令查看进程线程信息,找到导致CPU高的线程TID
[[email protected] syp]# ps -mp 12107 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 22.7 - - - - - - 00:42:58
root 0.0 19 - futex_ - - 12107 00:00:00
root 0.1 19 - futex_ - - 12108 00:00:19
root 4.6 19 - - - - 12109 00:08:50
root 4.6 19 - - - - 12110 00:08:50
root 4.6 19 - - - - 12111 00:08:48
root 4.6 19 - - - - 12112 00:08:49
root 1.2 19 - futex_ - - 12113 00:02:26

printf "%x\n" tid——命令转换线程为16进制格式
[[email protected] syp]# printf “%x\n” 12109
“2f4dn”

[[email protected] syp]# printf “%x\n” 12110
“2f4en”

[[email protected] syp]# printf “%x\n” 12111
“2f4fn”

[[email protected] syp]# printf “%x\n” 12112
“2f50n”

jstack pid |grep tid -A 30——命令查看线程信息,定位到具体线程
[[email protected] syp]# jstack 12107 | grep 2f4d -A 30
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f223405e000 nid=0x2f4d runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f2234060000 nid=0x2f4e runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f2234061800 nid=0x2f4f runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f2234063800 nid=0x2f50 runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f22341ed800 nid=0x2f59 waiting on condition

JNI global references: 1925

[[email protected] syp]# jstack 12107 | grep 2f4e -A 30
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f2234060000 nid=0x2f4e runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f2234061800 nid=0x2f4f runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f2234063800 nid=0x2f50 runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f22341ed800 nid=0x2f59 waiting on condition

JNI global references: 1925

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f2234061800 nid=0x2f4f runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f2234063800 nid=0x2f50 runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f22341ed800 nid=0x2f59 waiting on condition

JNI global references: 1925

[[email protected] syp]# jstack 12107 | grep 2f50 -A 30
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f2234063800 nid=0x2f50 runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007f22341ed800 nid=0x2f59 waiting on condition

JNI global references: 1925

原文地址:https://www.cnblogs.com/yucongblog/p/11987462.html

时间: 2024-10-07 11:09:41

java进程CPU高分析的相关文章

Java进程CPU高

Java进程CPU高1-1) 查看$PID进程里面的线程CPU占用状况    top -H -p $PID1-2) 显示线程列表,并按照CPU占用高的线程排序     ps -mp $PID -o THREAD,tid,time | sort -rn2) 找出CPU消耗较多的线程id, 并转换成16进制     printf "%x\n" $TID3) 查询出具体的线程状态     jstack $PID | grep -A 10 0x$TID

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

Linux下java进程CPU占用率高-分析方法

今天登陆同事的一台gateway 开始以为hive环境登陆不了了,仔细一看看了下是因为机器很卡,我每次等几秒没登陆就ctrl+c了,看了下是有个java进程cpu:340.4%  mem:14.6% 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top 一下 可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138 2. 找出消耗资源最高的线程 top -H -p  29580 

【疑难问题】Java疑难CPU高定位

1   CPU高分析 1.1   说明(root执行) 建议使用root账号执行命令,使用其他账号登录可能会无法看到部分进程信息. 1.2   查看服务进程ID(ps) 命令格式:  ps –ef | grep XXXX 1.3   查看机器CPU占用情况(top) 命令格式:  top 执行结果如下,结果会动态刷新 %CPU取值说明:以347949为例,58.7%并不是类似Windows的整体CPU占用率.CPU通常是多核,命令执行机器是8核CPU,则CPU全部可用率为8*100%=800%:

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 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.分析负载高

java程序CPU消耗分析之找出最耗CPU线程

java程序CPU消耗过高一般有两种情况: 1. us过高,应用占用CPU资源过高,需找出具体占用CPU的线程所执行的代码,分析定位问题原因. 分析步骤如下: (1) 使用top命令找出占用cpu最高的JAVA进程 (2) 找出占用cpu最高的线程  top -Hp 1781 (3) 占CPU最高线程17596换算成16进制对应线程44bc 用命令 printf "%x\n" 17596 (4) 打印占CPU最高JAVA进程1781的堆栈信息 jstack 1781> stack

查看JAVA占用CPU高的线程日志

# 1. 查看主进程占用cpu高 top # 1647 java # 2. 按照线程占用cpu由高到低进行排查: ps -mp 1647 -o THREAD,tid,time | sort -rn |head -6 # USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME # root 1.6 - - - - - - 00:02:07 # root 0.1 19 - futex_ - - 1767 00:00:11 # root 0.1 19 - futex

java进程CPU飙高

因为这段时间一直在弄监控,但是工作还是在进行中 因为机器不多,所以今天早上巡检了一下,看到一台生产机器上的CPU飙高 top 然后就请出了大神工具JVM 具体JVM的介绍看:http://www.cnblogs.com/smail-bao/p/6027756.html CPU飙高的话,我们就是用jstack的工具 首先我们使用top查出来是哪个进程导致的CPU飙高 这里我们看到是PID号为11506的进程 这个进程对应的项目是哪个(为了后面可以把错误的定位发给相关的开发人员看),使用ps -au

Java进程CPU占用高导致的网页请求超时的故障排查

一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多. 二.定位故障 根据这种故障的一般处理思路,先找出问题进程内CPU占用率高的线程,再通过线程栈信息找出该线程当时在运行的问题代码段,操作如下: 2.1.根据思路查看高占用的"进程中"占用高的"线程",追踪发现7163的进程中16298的线程占用较高,使用命令: top -Hbp 7163 | a