编辑
2024-03-12
实用工具
00
请注意,本文编写于 386 天前,最后修改于 46 天前,其中某些信息可能已经过时。

目录

简介
基本命令
jps
jstat
jstack
jmap
jinfo
jcmd
jconsole
VisualVM
总结
查询cpu飙高步骤
找到Java进程ID
执行 jstack 命令

简介

Java虚拟机(JVM)提供了多种命令行工具来帮助开发者监控和诊断Java应用程序的运行状态。这些工具能够提供关于内存使用、线程状态、垃圾回收活动等方面的信息,是优化性能和解决运行时问题的关键。

基本命令

jps

功能:列出当前用户启动的所有Java进程,包括进程ID(PID)和主类名称。

jps -l

-l 参数显示主类的完整包名或jar文件路径。

jstat

功能:监控JVM性能统计信息,如垃圾回收、编译器活动等。

jstat -gc <pid> 1000

每秒输出一次指定PID的垃圾回收统计信息。

jstack

功能:打印给定Java进程的线程堆栈跟踪信息,有助于分析死锁、线程阻塞等问题。

jstack -l <pid>

-l 参数打印关于锁的额外信息。

jmap

功能:用于生成Java进程的堆转储快照或查看堆内存使用详情。

jmap -heap <pid>

查看指定进程的堆配置及使用情况;或者

jmap -dump:format=b,file=heapdump.hprof <pid>

生成堆转储文件。

jinfo

功能:实时查看并调整正在运行的Java应用的JVM参数。

jinfo -flag +PrintGCDetails <pid>

开启GC详细日志输出。

jcmd

功能:支持执行多种诊断命令,如获取VM标志、堆转储、GC调用等。

jcmd <pid> GC.heap_dump /path/to/heapdump.hprof

创建一个堆转储文件。

jconsole

功能:提供了一个图形界面,可以用来监控Java应用程序的性能指标,包括内存使用、线程状态、类加载数量等。

启动方法: 直接在终端输入jconsole启动,然后通过GUI连接到本地或远程Java进程进行监控。

VisualVM

功能:作为jconsole的升级版,它不仅提供了基本的监控功能,还增加了对MBeans的支持、性能剖析等功能。

启动方法: 可以从JDK安装目录下的bin文件夹中找到jvisualvm启动程序。

总结

这些工具各自专注于不同的方面,合理利用它们可以帮助你更好地理解和优化Java应用程序的性能。

例如,当遇到内存泄漏问题时,可以使用jmap生成堆转储文件,并用Eclipse MAT等工具进行深入分析;而遇到CPU飙高或线程相关的问题,则可以通过jstack来查看线程堆栈跟踪。

根据具体需求选择合适的工具组合使用,可以更有效地解决问题。

查询cpu飙高步骤

找到Java进程ID

首先,你需要知道要监控的Java应用的进程ID(PID)。可以使用 jps 或者 ps 命令来查找。

jps -l

或者

ps -ef | grep java

执行 jstack 命令

一旦知道了目标Java进程的PID,就可以使用 jstack 来获取该进程的线程堆栈信息。

jstack [pid]

其中 [pid] 是你的Java应用的进程ID。这将输出所有线程的状态和它们当前正在执行的方法调用链。

附加选项: -l:长列表。除了打印每个线程的堆栈跟踪外,还会打印关于锁的额外信息。

-F:强制模式。如果jstack pid没有响应,则可以使用此选项强制生成堆栈跟踪。

定位CPU飙高的问题

当遇到CPU使用率异常飙高的情况时,可以通过以下步骤使用jstack进行诊断:

找出消耗CPU最多的线程:首先需要确定是哪些线程占用了大量的CPU资源。可以使用 top 或者 ps 命令结合一些过滤条件来查看。

top -H -p <pid>

找到占用CPU较高的线程ID(TID),然后将其转换为十六进制格式(因为线程堆栈输出中的线程ID是以十六进制形式表示的)。

printf "%x\n" <tid>

获取线程堆栈快照:使用jstack获取指定Java进程的线程堆栈快照。

jstack <pid> > threaddump.log

分析日志文件:在生成的日志文件中搜索转换后的十六进制线程ID,找到对应的线程堆栈信息。

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!