一、使用top+jstack定位java应用CPU占用高的线程步骤
- ps axu | grep java 或者直接jps得到进程号
- top -p java进程号
- 在top界面按小写的s改变默认刷新值到0.5s
- 在shift +h 键,按线程进行显示
- 到现在为止,基本可以看到是哪个线程占用CPU较高了
- 假如线程号为21646,转换为16进制 548e
- jstack java进程号 | grep -A 20 java线程号16进制
二、使用top+jstack定位java应用CPU占用高的线程详细说明
1.top查找出哪个进程消耗的cpu高
PID |
USER |
PR |
NI |
VIRT |
RES |
SHR |
S |
%CPU |
%MEM |
TIME+ |
COMMAND |
21125 |
co_ad2 |
18 |
0 |
1817m |
776m |
9712 |
S |
3.3 |
4.9 |
12:03.24 |
java |
5284 |
co_ad |
21 |
0 |
3028m |
2.5g |
9432 |
S |
1.0 |
16.3 |
6629:44 |
java |
21994 |
mysql |
15 |
0 |
449m |
88m |
5072 |
S |
1.0 |
0.6 |
67582:38 |
mysqld |
8657 |
co_sparr |
19 |
0 |
2678m |
892m |
9220 |
S |
0.3 |
5.7 |
103:06.13 |
java |
这里我们分析21125这个java进程。
2.top中shift+h查找出哪个线程消耗的cpu高
PID |
USER |
PR |
NI |
VIRT |
RES |
SHR |
S |
%CPU |
%MEM |
TIME+ |
COMMAND |
21233 |
co_ad2 |
15 |
0 |
1807m |
630m |
9492 |
S |
1.3 |
4.0 |
0:05.12 |
java |
20503 |
co_ad2_s |
15 |
0 |
1360m |
560m |
9176 |
S |
0.3 |
3.6 |
0:46.72 |
java |
21134 |
co_ad2 |
15 |
0 |
1807m |
630m |
9492 |
S |
0.3 |
4.0 |
0:00.72 |
java |
22673 |
co_ad2 |
15 |
0 |
1807m |
630m |
9492 |
S |
0.3 |
4.0 |
0:03.12 |
java |
这里我们分析21233这个线程,并且注意的是,这个线程是属于21125这个进程的。
3.jstack查找这个线程的信息
jstack [进程]|grep -A 10 [线程的16进制]
即:jstack 21125 |grep -A 10 52f1
-A 10表示查找到所在行的后10行。21233转换为16进制52f1,注意字母是小写。
结果:
写道
"http-8081-11" daemon prio= 10 tid= 0x00002aab049a1800 nid= 0x52f1 in Object.wait() [ 0x0000000042c75000 ]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485 )
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416 )
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485 )
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416 )
说不定可以一下子定位到出问题的代码。
三、找出占用cpu高的java线程脚本
写道
#!/bin/bash
typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_$pid_$$.trace
$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu|tail -$top|awk '$2==pid{print $4"\t"$6}' pid=$pid|while read line;
do
typeset nid="0x"$(echo "$line"|awk '{print $1}'|xargs -I{} echo "obase=16;{}"|bc|tr 'A-Z' 'a-z')
typeset cpu=$(echo "$line"|awk '{print $2}')
cat $tmp_file|awk '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="'"$cpu"'"%");}'
done;
rm -f $tmp_file
typeset top=${1:-10}
typeset pid=${2:-$(pgrep -u $USER java)}
typeset tmp_file=/tmp/java_$pid_$$.trace
$JAVA_HOME/bin/jstack $pid > $tmp_file
ps H -eo user,pid,ppid,tid,time,%cpu --sort=%cpu|tail -$top|awk '$2==pid{print $4"\t"$6}' pid=$pid|while read line;
do
typeset nid="0x"$(echo "$line"|awk '{print $1}'|xargs -I{} echo "obase=16;{}"|bc|tr 'A-Z' 'a-z')
typeset cpu=$(echo "$line"|awk '{print $2}')
cat $tmp_file|awk '/nid='"$nid"'/,/^$/{print $0"\t"(isF++?"":"cpu="'"$cpu"'"%");}'
done;
rm -f $tmp_file
四、jtop
https://code.google.com/p/hatter-source-code/wiki/jtop
相关推荐
总之,解决Java程序CPU占用过高问题需要多方面的排查和优化,包括但不限于源码优化、线程分析、内存管理、垃圾收集策略调整以及外部资源的优化。通过持续监控、细致的分析和有针对性的改进,可以有效地提高Java应用...
通过以上步骤,我们可以有效地找出并解决Linux服务器上Java应用占用CPU过高的问题。记得在处理过程中保持耐心和细致,因为性能问题往往需要深入分析才能找到根本原因。同时,定期的性能测试和代码审查也是预防此类...
在IT领域,特别是系统监控与性能分析中,获取CPU占用率是评估系统健康状况和优化资源分配的关键步骤。本文将详细解析如何使用Java语言来获取CPU占用率,这不仅涉及了基本的Java编程技巧,还深入到了操作系统级别的...
Java 应用 CPU 占用过高问题分析及解决方法 Java 应用程序的 CPU 占用率过高是一个常见的问题,影响着系统的性能和稳定性。在本文中,我们将讨论 Java 应用程序 CPU 占用率过高的原因、分析方法和解决方法。 一、...
有一些工具如Process Explorer(微软出品)或VisualVM(Java应用性能分析工具)能提供更详细的性能分析,帮助定位问题。 8. **资源调度优化**: 对于多核CPU,合理分配任务到不同核心可以有效减少单个核心的负载...
在Java编程环境中,当遇到“Java进程CPU占用率高”的问题时,这通常意味着Java应用程序在执行过程中消耗了大量计算资源,可能导致系统响应变慢,甚至出现性能瓶颈。本篇文章将深入探讨这个问题,并提供相关解决方案...
在Java应用程序的运行过程中,有时会遇到进程占用CPU和内存过高导致系统性能下降的问题。针对这类问题,开发者需要进行深入的排查与优化。本压缩包文件包含了一些关键工具和输出,帮助我们理解如何进行这样的排查。 ...
通过上述方法,你可以根据实际需求选择合适的方式来获取Java应用的CPU占用率。在进行性能优化或者问题排查时,这将是一个非常实用的工具。记得在实际应用中遵循最佳实践,确保代码的稳定性和兼容性。
- **线程泄露**:检查是否存在未正确关闭的线程,它们可能一直在后台运行并占用CPU资源。 - **数据库或其他I/O操作**:确认是否因为等待I/O操作完成而导致CPU占用过高。 通过对以上步骤的分析,我们通常能够定位到...
通过以上分析和解决策略,我们可以有效地排查和处理Tomcat占用CPU高的问题,保证应用的稳定性和性能。在实际操作中,每个环境都有其特殊性,因此要具体情况具体分析,确保找到最合适的解决方案。
在开发和运维过程中,有时会遇到Java应用的性能问题,如线程CPU占用过高或者线程死锁。这时,我们就需要用到JVM提供的工具,如`jstack`,来帮助诊断和解决问题。 `jstack` 是JDK自带的一个命令行工具,它能够打印出...
总结来说,处理Java应用CPU过高的问题需要结合系统监控工具和Java自身提供的诊断工具,通过分析线程状态和堆栈信息来定位问题。同时,理解应用程序的运行环境和组件配置也至关重要,例如在Web容器中部署应用时要注意...
在日常的运维与开发工作中,经常遇到Java应用出现高CPU占用的问题。这类问题不仅会影响系统的稳定性和响应速度,还可能导致服务不可用。因此,对于此类故障的快速定位和解决变得尤为重要。下面将详细介绍如何进行...
例如,`jps` 可以显示运行的Java应用程序的进程ID。 3. **`top` 命令**: - `top` 提供了一个实时的视图,显示了系统资源的使用情况,包括CPU和内存。通过`top`,你可以看到哪个Java进程占用了最多的CPU。 4. **`...
- 通过分析`cpu1128.log`中的信息,可以找出占用CPU较高的线程正在执行的任务,进而判断其是否正常工作或是存在性能瓶颈。 #### 四、进一步分析线程 1. **转换线程ID为十六进制格式** - 在某些情况下,我们可能...
最后,学习如何查看和分析`jstack`生成的Dump日志对于长期优化Java应用性能至关重要。通过深入理解这些工具和方法,你可以有效地预防和解决Java项目运行时CPU使用率过高的问题,从而确保应用程序的稳定性和效率。
### Java 获取 CPU 使用率及内存信息 #### 一、背景介绍 在计算机系统管理与监控领域,了解系统的CPU使用率及内存使用情况是至关重要的。对于Java开发者来说,能够通过编程方式获取这些信息有助于更好地管理和优化...
### JAVA编程高级-多线程编程 #### 一、多线程简介 多线程编程是一种软件技术,它允许在单个程序内并发执行多个控制流。...掌握好Java中的多线程机制,可以帮助开发者更好地设计和实现高效的应用程序。