马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
java应用导致cpu占用过高问题分析及解决办法
9 \9 @+ @5 t* \! f
" _7 c" g3 N- E! R主要介绍了java应用cpu占用过高问题分析及解决方法,具有一定参考价值,需要的朋友可以参考下。 使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如 55001 # D: g8 c3 u$ k# `
[devops@ops_prod_flink_01 neo4j]$ jps 60226 Jps 55001 CommunityEntryPoint
9 U0 ^! \- R& P0 [( b2 D4 ?[devops@ops_prod_flink_01 ~]$ top -p 55001 -H 2、使用 top -p 55001 -H 观察该进程中所有线程的CPU占用 top - 10:05:07 up 537 days, 16:08, 2 users, load average: 0.10, 2.92, 9.17 Threads: 67 total, 0 running, 67 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.2 us, 0.8 sy, 0.0 ni, 98.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 24636208 total, 10156628 free, 2782836 used, 11696744 buff/cache KiB Swap: 2097148 total, 2053116 free, 44032 used. 20841700 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 55033 devops 20 0 6395992 692476 22340 S 1.0 2.8 0:03.13 java 55034 devops 20 0 6395992 692476 22340 S 0.7 2.8 0:03.90 java 55035 devops 20 0 6395992 692476 22340 S 0.3 2.8 0:03.36 java 55036 devops 20 0 6395992 692476 22340 S 0.3 2.8 0:02.46 java 55098 devops 20 0 6395992 692476 22340 S 0.3 2.8 0:00.58 java 57048 devops 20 0 6395992 692476 22340 S 0.3 2.8 0:00.14 java 55001 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55006 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:03.62 java 55007 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.08 java 55008 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.08 java 55009 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.08 java 55010 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.07 java 55011 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.07 java 55012 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.09 java 55013 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.09 java 55014 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.07 java 55015 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.18 java 55016 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55017 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55018 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55019 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55020 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55021 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java 55022 devops 20 0 6395992 692476 22340 S 0.0 2.8 0:00.00 java
* a1 F. \: U0 D1 Q, w& P/ ` PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3,找出CPU消耗较多的线程id,如55033,将55033转换为16进制0xd6f4,注意是小写哦 4,使用jstack 55001|grep -A 10 0xd6f4来查询出具体的线程状态 [devops@ops_prod_flink_01 neo4j]$ jstack 55001 |grep -A 10 0xd6f4 "VM Thread" os_prio=0 tid=0x00007fae7c1fb000 nid=0xd6f4 runnable "Gang worker#0 (Parallel GC Threads)" os_prio=0 tid=0x00007fae7c024800 nid=0xd6df runnable "Gang worker#1 (Parallel GC Threads)" os_prio=0 tid=0x00007fae7c026800 nid=0xd6e0 runnable "Gang worker#2 (Parallel GC Threads)" os_prio=0 tid=0x00007fae7c028000 nid=0xd6e1 runnable "Gang worker#3 (Parallel GC Threads)" os_prio=0 tid=0x00007fae7c02a000 nid=0xd6e2 runnable
, u% l4 N1 D3 [6 h! Q4 _* y' N% L9 V"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007fae7c02c000 nid=0xd6e3 runnable 通过这些线程状态便可基本定位问题之所在。 方法1 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.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。 方法2 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 / K7 k: g( B) y# F5 P1 N+ R: x
$ [, X2 j$ f. ~ a |