首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | Java代码是怎么运行的?
02 | Java的基本类型
03 | Java虚拟机是如何加载Java类的?
04 | JVM是如何执行方法调用的?(上)
05 | JVM是如何执行方法调用的?(下)
06 | JVM是如何处理异常的?
07 | JVM是如何实现反射的?
08 | JVM是怎么实现invokedynamic的?(上)
09 | JVM是怎么实现invokedynamic的?(下)
10 | Java对象的内存布局
11 | 垃圾回收(上)
12 | 垃圾回收(下)
13 | Java内存模型
14 | Java虚拟机是怎么实现synchronized的?
15 | Java语法糖与Java编译器
16 | 即时编译(上)
17 | 即时编译(下)
18 | 即时编译器的中间表达形式
19 | Java字节码(基础篇)
20 | 方法内联(上)
21 | 方法内联(下)
22 | HotSpot虚拟机的intrinsic
23 | 逃逸分析
24 | 字段访问相关优化
25 | 循环优化
26 | 向量化
27 | 注解处理器
28 | 基准测试框架JMH(上)
29 | 基准测试框架JMH(下)
30 | Java虚拟机的监控及诊断工具(命令行篇)
31 | Java虚拟机的监控及诊断工具(GUI篇)
32 | JNI的运行机制
33 | Java Agent与字节码注入
34 | Graal:用Java编译Java
35 | Truffle:语言实现框架
36 | SubstrateVM:AOT编译框架
当前位置:
首页>>
技术小册>>
深入拆解 Java 虚拟机
小册名称:深入拆解 Java 虚拟机
### 30 | Java虚拟机的监控及诊断工具(命令行篇) 在Java应用程序的开发与运维过程中,对Java虚拟机(JVM)的有效监控与诊断是确保系统稳定运行、性能优化及快速定位问题的关键步骤。本章将深入探讨Java虚拟机监控与诊断的命令行工具,这些工具无需图形界面,通过终端或命令行即可执行,为开发者与运维人员提供了强大而灵活的问题排查手段。 #### 一、引言 Java虚拟机监控与诊断工具主要分为两大类:一类是随JDK自带的工具,如`jps`、`jstat`、`jinfo`、`jmap`、`jstack`、`jcmd`等;另一类则是第三方提供的专业工具,如VisualVM、JConsole等(尽管这些工具也支持图形界面,但本章重点聚焦于命令行工具)。命令行工具以其轻量级、易于脚本集成、可在无图形界面环境下操作等优点,在自动化运维、远程监控等场景中尤为重要。 #### 二、JDK自带监控及诊断工具 ##### 2.1 jps(Java Virtual Machine Process Status Tool) `jps`是Java虚拟机进程状态工具,用于列出当前机器上所有Java虚拟机的进程ID(PID)及其主类名(或JAR包名)等信息。这对于在多进程环境中快速定位Java进程非常有用。 - **基本用法**: ```bash jps -l # 显示Java进程的完整主类名或JAR路径 jps -m # 显示传递给Java虚拟机主类的参数 jps -v # 显示传递给JVM的参数 ``` ##### 2.2 jstat(Java Virtual Machine Statistics Monitoring Tool) `jstat`用于监控基于HotSpot的JVM中各类资源及性能计数器信息,如类加载、内存使用、垃圾收集等。 - **基本用法**: ```bash jstat -gc <pid> <interval> <count> # 监控指定Java进程的垃圾收集情况,每隔<interval>毫秒输出一次,共输出<count>次 jstat -class <pid> # 查看类的加载、卸载及总空间等信息 ``` ##### 2.3 jinfo(Java Configuration Info) `jinfo`用于打印指定Java进程的系统属性及JVM配置参数。这对于确认JVM启动参数是否被正确设置非常有帮助。 - **基本用法**: ```bash jinfo -flags <pid> # 显示Java进程的JVM启动参数 jinfo -sysprops <pid> # 显示Java进程的系统属性 ``` ##### 2.4 jmap(Java Memory Map) `jmap`用于生成Java堆的快照(heap dump),并可以查看堆内存中的对象信息,如对象数、对象大小、类信息等。这对于分析内存泄漏等问题至关重要。 - **基本用法**: ```bash jmap -heap <pid> # 查看堆内存的配置和使用情况 jmap -histo <pid> # 显示堆中对象的统计信息,包括类名、实例数、总大小等 jmap -dump:format=b,file=<heapdump.hprof> <pid> # 将堆内存的快照导出到文件,用于后续分析 ``` ##### 2.5 jstack(Java Stack Trace) `jstack`用于生成Java虚拟机的当前线程快照,包括每个线程的堆栈跟踪。这有助于分析线程死锁、线程阻塞等问题。 - **基本用法**: ```bash jstack <pid> # 打印出指定Java进程的所有线程的堆栈跟踪 ``` ##### 2.6 jcmd(Java Command Line Tool) `jcmd`是一个多功能工具,它集合了多个其他JVM诊断命令的功能于一体,提供了更加强大和灵活的监控与诊断能力。 - **基本用法**: ```bash jcmd <pid> help # 显示所有可用的命令列表 jcmd <pid> GC.class_stats # 查看垃圾收集器的类加载统计信息 jcmd <pid> Thread.print # 打印线程信息,类似于jstack ``` #### 三、使用技巧与最佳实践 1. **组合使用工具**:在实际问题排查中,很少单独使用某一个工具就能完全解决问题。通常需要将多个工具结合起来,比如先用`jps`找到目标进程,然后用`jstat`监控内存使用情况,最后用`jmap`和`jstack`生成堆转储和线程快照进行深入分析。 2. **定期监控**:将JVM监控工具集成到自动化脚本中,定期对JVM的性能指标进行监控,可以及时发现潜在问题,避免问题扩大。 3. **日志记录**:利用`jcmd`等工具记录JVM的运行状态日志,为后续的性能分析和问题排查提供数据支持。 4. **性能调优**:通过对监控数据的分析,可以调整JVM的启动参数(如堆内存大小、垃圾收集器选择等),以优化应用程序的性能。 5. **注意权限问题**:在执行这些命令时,需要确保有足够的权限来访问目标Java进程。在某些系统上,可能需要以root用户或使用sudo来执行这些命令。 6. **学习最新版本的工具**:随着JDK版本的更新,这些工具的功能和用法也可能会有所变化。因此,建议定期查阅最新的官方文档,以了解最新的功能和最佳实践。 #### 四、总结 Java虚拟机的监控及诊断是Java应用程序运维中不可或缺的一环。通过熟练掌握JDK自带的命令行工具,如`jps`、`jstat`、`jinfo`、`jmap`、`jstack`和`jcmd`等,开发者与运维人员可以更加高效地监控JVM的运行状态,及时发现并解决潜在问题。同时,结合自动化脚本和定期监控策略,可以进一步提升Java应用程序的稳定性和性能。希望本章内容能为读者在Java虚拟机监控与诊断方面提供有益的参考和指导。
上一篇:
29 | 基准测试框架JMH(下)
下一篇:
31 | Java虚拟机的监控及诊断工具(GUI篇)
该分类下的相关小册推荐:
Mybatis合辑2-Mybatis映射文件
Java语言基础12-网络编程
Java语言基础11-Java中的泛型
Java语言基础13-类的加载和反射
Java语言基础10-Java中的集合
Java语言基础2-运算符
Java并发编程
经典设计模式Java版
Java语言基础1-基础知识
手把手带你学习SpringBoot-零基础到实战
JAVA 函数式编程入门与实践
Java性能调优实战