摘要 JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。
B、 jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
1
2
3
|
jstack [option] pid jstack [option] executable core jstack [option] [server- id @]remote- hostname -or-ip
|
命令行参数选项说明如下:
1
2
|
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况 -m mixed mode,不仅会输出Java堆栈信息,还会输出C /C ++堆栈信息(比如Native方法)
|
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
第一步先找出Java进程ID,我部署在服务器上的Java应用名称为mrf-center:
1
2
|
root@ubuntu:/ # ps -ef | grep mrf-center | grep -v grep
root 21711 1 1 14:47 pts /3 00:02:10 java -jar mrf-center.jar
|
得到进程ID为21711,第二步找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我这里用第三个,输出如下:
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用
1
|
printf "%x\n" 21742
|
得到21742的十六进制值为54ee,下面会用到。
OK,下一步终于轮到jstack上场了,它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下:
1
2
|
root@ubuntu:/ # jstack 21711 | grep 54ee
"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait() [0x00007f94c6eda000]
|
可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait(),我找了下我的代码,定位到下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// Idle wait getLog().info( "Thread [" + getName() + "] is idle waiting..." );
schedulerThreadState = PollTaskSchedulerThreadState.IdleWaiting; long now = System.currentTimeMillis();
long waitTime = now + getIdleWaitTime();
long timeUntilContinue = waitTime - now;
synchronized (sigLock) {
try {
if (!halted.get()) {
sigLock.wait(timeUntilContinue);
}
}
catch (InterruptedException ignore) {
}
} |
它是轮询任务的空闲等待代码,上面的sigLock.wait(timeUntilContinue)就对应了前面的Object.wait()。
相关推荐
计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料计算机技术、IT咨询、人工智能AI理论介绍,学习...
### JVM工具详解与参数调优&调试技巧 #### 一、JVM工具 JVM工具是一系列用于监控、管理和诊断Java虚拟机运行状态的工具集合。这些工具可以帮助开发者更好地理解和优化Java应用程序的性能。 ##### 1. jps:虚拟机...
例如,`jmap -dump:format=b,file=<filename> <pid>`会生成一个Hprof格式的内存转储文件,然后可以使用其他工具如VisualVM或Eclipse Memory Analyzer(MAT)进行深入分析。此外,jmap还支持检查堆和对象的详细信息,...
这两个图形化工具(通常位于`$JAVA_HOME/bin` 目录下)提供了对JVM性能和监视的直观视图,包括线程、内存、CPU使用率等。 ### 10. `jinfo` 命令 `jinfo` 用于显示和修改Java进程的配置信息,例如: ```bash jinfo...
- **诊断工具和选项**:介绍了一系列用于故障排查和性能监控的工具和配置选项。 #### 二、关键知识点详解 ##### (一)前言 - **关于本文档**:提供了文档的目的和范围说明。 - **目标受众及先决条件**:明确了本...
│ │ jstack.exe │ │ jstat.exe │ │ jstatd.exe │ │ jvisualvm.exe │ │ keytool.exe │ │ kinit.exe │ │ klist.exe │ │ ktab.exe │ │ msvcr100.dll │ │ native2ascii.exe │ │ orbd.exe │ │ ...