Java应用程序高CPU故障诊断(troubleshooting)思路
来源:互联网 发布:mac 如何切换中英文 编辑:程序博客网 时间:2024/06/10 14:08
系统运行出现高CPU报警,一般可以通过top或者任务管理器找到哪些进程在使用CPU,但这个粒度不能让我们知道得更多,我们需要找到程序的哪部分在占用CPU并且在占用CPU做什么,这样才有利于我们以后调优,下面介绍一种可行的思路:
- 找到占用CPU高的进程p
- 找到进程p中占用CPU高的线程t
- 找到线程t在做什么
本文以Linux下Java应用程序为例,其他环境或程序可参照该思路,只要思路清晰就好办了
- 打开top,在top中按shift+p按照CPU使用量倒序显示进程,找到占用CPU较高的进程号pid,然后退出top
- top -H -p pid 显示该进程中线程的运行情况,pid可以指定多个,在top中按shift+p按照CPU占用倒序显示线程,找到占用CPU高的线程tid,比如是27890,通过printf打印出该tid的是十六进制号
$ printf "%x\n" 27890 6cf2
- 通过threaddump工具以十六进制号查看该线程当前的堆栈信息,Java中threaddump工具为jstack
$ jstack -l <pid> | grep -i 0x6cf2 -A 15
- 多次重复执行1-3步骤,确定线程所做的耗时操作,注意步骤1-3之间延时越短越准确,最好在多个shell窗口下执行
通过上面的操作我们就可以确定哪段代码在大量占用CPU资源了,得到的结果如下
"Thread-12" daemon prio=10 tid=0x00007f926c021000 nid=0xba7 runnable [0x00007f92c06d7000] java.lang.Thread.State: RUNNABLE at java.io.FileOutputStream.writeBytes(Native Method) at java.io.FileOutputStream.write(FileOutputStream.java:282) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) - locked <0x0000000780d79ae0> (a java.io.BufferedOutputStream) at java.io.PrintStream.write(PrintStream.java:432) - locked <0x0000000780d79ac0> (a java.io.PrintStream) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:85) - locked <0x0000000780d79c10> (a java.io.OutputStreamWriter) at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:168) at java.io.PrintStream.write(PrintStream.java:477) - locked <0x0000000780d79ac0> (a java.io.PrintStream) at java.io.PrintStream.print(PrintStream.java:619) at java.io.PrintStream.println(PrintStream.java:773) - locked <0x0000000780d79ac0> (a java.io.PrintStream) at org.apache.tomcat.util.log.SystemLogHandler.println(SystemLogHandler.java:242) at java.lang.Throwable.printStackTrace(Throwable.java:461) - locked <0x0000000780d79a98> (a org.apache.tomcat.util.log.SystemLogHandler) at java.lang.Throwable.printStackTrace(Throwable.java:451) at com.zhaopin.framework.cache.CacheListHandler$TimeoutTimerThread.run(CacheListHandler.java:101) at java.lang.Thread.run(Thread.java:662)
上述仅是一个故障诊断的思路,非Java或者Linux可以通过类似的工具完成,比如windows下可以通过Process Explorer替代top查看进程和线程相关内容等
0 0
- Java应用程序高CPU故障诊断(troubleshooting)思路
- Java 高CPU占用
- Java troubleshooting
- HBase troubleshooting的一般思路
- HBase troubleshooting的一般思路
- java高并发解决思路
- JAVA高性能高并发解决思路
- Linux 系统 CPU 占用率较高问题排查思路
- Db2性能:操作系统CPU高问题分析的一些思路
- java cpu高 问题诊断
- JAVA CPU占用率高问题解决
- java进程占用cpu高
- RAC11gR2Grid启动顺序及启动故障诊断思路
- 应用程序运行慢(cpu util 高)的一种可能原因
- TROUBLESHOOTING: java.security.PrivilegedActionException
- java高并发的解决思路
- 在Java应用程序中动态分配CPU资源
- Troubleshooting: High CPU Utilization (文档 ID 164768.1)
- 第十一周项目一 储存班长信息的学生类
- 对抽象类的理解
- 15HD_OJ题——人见人爱A^B
- spark SQL源码阅读001——sql.core包核心类——001执行SQL语法解析
- Android界面切换
- Java应用程序高CPU故障诊断(troubleshooting)思路
- 详解js闭包
- Tomcat启动报错Cannot connect to VM
- 二叉查找树
- 算法学习---红黑树
- 【操作系统】进程调度及其算法
- Thread.currentThread().getContextClassLoader()
- hihocoder#1055之刷油漆
- 【.net基础】--.NET、winform、Asp.Net区别