Loading...

深入理解 Java 虚拟机(二)

前一篇文章中,集中对 JVM 内存区域、常用垃圾收集器及垃圾收集算法相关知识进行了较为全面的整理。本片文章将继续整理 Java 虚拟机性能监控工具的使用,以及例举相关的调优案例。
本片文章核心参考了《深入理解 Java 虚拟机》一书,相关知识内容对应该书第四章至第五章。

基础故障处理工具

在 JDK 安装包的 bin 目录中会默认存在 java.exejavac.exe等可执行程序,这些可执行程序为开发人员提供了诸多便利,可应用于打包、部署、签名、调试、监控、运维等各种场景。这些工具本身就是一系列 Shell 脚本的封装,因此在体积占用方面也十分小,且允许开发人员进行编辑修改。
虽然 JDK 提供的这些小工具本身对于 JAVA 的整体应用并没有什么重要影响,但它们的存在为研发人员的工作提供了极大的便利。

jps - 进程信息状况监控

jps(Java Virtual Machine Process Status Tool)是 Java 中的一个命令行工具,用于显示当前系统中所有正在运行的 Java 虚拟机(JVM)进程的信息。它可以列出 JVM 进程的进程 ID 和 JVM 的启动类主函数的全限定类名。它是 JDK 提供的一个工具,可用于在开发和调试过程中监控和管理 Java 应用程序的运行状态。
使用 jps 命令,可以查看运行在本地或远程机器上的 Java 应用程序的进程状态。它可以让开发人员确定哪些 Java 进程正在运行,以及它们的 PID。此外,还可以显示每个 Java 进程的主类,帮助开发人员更好地理解正在运行的 Java 应用程序的架构和配置。
jps 命令的用法很简单,只需要在控制台中输入jps即可列出所有正在运行的 Java 进程的相关信息。

jps [ options ] [ hostid ]

jps 主要有以下可选参数:

  1. -q:只输出 LVMID,省略主类的名称。

  2. -m:输出虚拟机成成启动时传递给主类 main() 函数的参数。

  3. -l:输出主类的全名,在如果进程执行的是 JAR 包,则输出 JAR 路径。

  4. -v:输出虚拟机进程启动时的 JVM 参数。

总的来说,jps 是用于从命令行中查看 Java 虚拟机进程的工具,它提供了一种简单快捷的方式来确定哪些 Java 进程正在运行,以及它们的相关信息,方便开发人员进行应用程序的调试和监控。

jstat - 虚拟机统计信息监视工具

jstat 是一个用于监视 Java 虚拟机统计信息的命令行工具。它可以显示出 Java 虚拟机进程的性能和资源利用情况,以及垃圾回收器的运行情况。
使用 jstat 命令,可以获取以下几类统计信息:

  • 目标 Java 虚拟机的类加载情况,包括加载的类数量、已经加载的类数量、未加载的类数量等;

  • 目标 Java 虚拟机的垃圾回收情况,包括垃圾回收器的运行时间、垃圾回收的次数、垃圾回收的总时间等;

  • 目标 Java 虚拟机的堆内存情况,包括堆内存的使用量、堆内存的垃圾回收情况、堆内存中的新生代和老年代的使用量等;

  • 目标 Java 虚拟机的线程情况,包括线程的数量、线程的状态、线程的堆栈情况等。

使用 jstat 命令时,需要指定目标Java虚拟机的进程ID或者连接的本地或远程虚拟机。可以通过在命令行中输入 jstat -options来获取更详细的参数选项。

jstat [ option vmid [interval [s|ms] [count]] ]

jstat 主要有以下可选参数:

  1. -class:监视类加载、卸载数量、总空间以及类装载所耗费的时间。

  2. -gc:监视 Java 堆中各内存区域的容量,已用空间,辣鸡手机时间合计等信息。

  3. -gccapacity:监视内容与 -gc基本相同,但输出主要关注 Java 堆各区域使用到的最大、最小空间。

  4. -gcutil:监视内容与 -gc基本相同,但输出内容主要关注已使用空间占总空间的百分比。

  5. -gccause:与 -gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因。

  6. -gcnew:监视新生代垃圾收集状况。

  7. -gcnewcapacity:监视内容与 -gcnew基本相同,输出主要关注使用到的最大、最小空间。

  8. -gcold:监视老年代垃圾收集状况。

  9. -gcoldcapacity:监视内容与 -gcold基本相同,输出主要关注使用到的最大、最小空间。

  10. -gcpermcapacity:输出永久代使用到的最大、最小空间。

  11. -compiler:输出即时编译器编译过的方法、耗时等信息。

  12. -printcompilation:输出已经被及时编译的方法。

总的来说,jstat 命令是一个用于监视和分析 Java 虚拟机性能的工具,可以提供有关 Java 进程的运行情况和垃圾回收情况的实时统计信息。

jinfo - Java 配置信息工具

jinfo 的作用是实时查看和调整虚拟机各项参数。使用 jps -v可以查看虚拟机启动时显式指定的参数列表,但对于未被显式指定的参数,则需要通过 jinfo -flag进行查询。

jinfo [ option ] pid

jinfo 主要有以下可选参数:

  1. -flag :打印指定名称的JVM标志的当前值。

  2. -flags:打印所有可设置的JVM标志的名称和当前值。

  3. -sysprops:打印Java系统属性的名称和当前值。

  4. -sysprop :打印指定名称的Java系统属性的值。

  5. -clstats:打印加载类的统计信息,包括类加载器名称、已加载的类数量、未绑定的类数量和总共加载的类数量。

  6. -finalizerinfo:打印所有已注册的Finalizer线程的信息,包括线程ID、等待的对象数量和等待时间。

  7. -p :指定要打印信息的Java进程ID。

jmap - Java 内存映像工具

jmap 命令用于生成 Java 进程的内存映像,并提供了一些有用的信息,用于分析和调试 Java 应用程序的内存使用情况。
除此之外,jmap 还可以查询 finalize 执行队列、Java 堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap 命令在 windows 平台下是受限的,除了生成堆转储快照的 -dump 选项和用于查看每个类的实例、空间占用统计的 -histo 选项在所有操作系统中都可以使用外,其他选项都只能在 Linux/Solaris 系统中使用。

jmap [ option ] vmid

jmap 主要有以下可选参数:

  1. -dump:生成 Java 堆转储快照,格式为:-dump:[live,]format=b,file=<filename>

  2. finalizerinfo:显示 F-Queue 中等待 Finalizer 线程执行 finalize 方法的对象。

  3. -heap:显示 Java 对详细信息,如使用哪种回收器、参数配置、分代状况等。

  4. -histo:显示堆中对象统计信息,包括类、实例 数量、合计容量。

  5. -permstat:以 ClassLoader 为统计口径显示永久代内存状态。

  6. -F:当虚拟机进程对 -dump选项没有响应时,可使用这个选项强制生成 dump 快照。

jhat - 虚拟机堆转储快照分析工具

JDK 提供 jhat 命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。
但实际上 jhat 的分析功能比较简陋,在实际应用过程中,有许多更加优秀的可视化快照分析工具可供选择。

jstack - Java 堆栈跟踪工具

jstack 命令用于生成虚拟机当前时刻的线程快照。通过使用 jstack 命令,可以查看 Java 进程中每个线程的堆栈跟踪信息,包括线程的状态、运行中的方法等。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现的长时间停顿的原因。它可以用于查找死锁、检测线程间的竞争条件、查看线程的调用堆栈等。

jstack [ option ] vmid 

jstack 主要有以下可选参数:

  1. -F:当正常输出的请求不被响应时,强制输出线程堆栈。

  2. -l:除堆栈外,显示关于锁的附加信息。

  3. -m:当调用到本地方法时,可以显示 C/C++ 的堆栈。

在 Java 开发过程中,也可以使用 java.lang.Thread类中的 getAllStackTraces()方法获取虚拟机中所有线程的 StackTraceElement 对象,可以很好地应用到 Java 项目的管理员界面中。
需要注意的是,jstack 命令可能会造成 Java 进程的短暂停顿,因为它会给 Java 进程中的每个线程发送信号,所以在生产环境中建议谨慎使用。

基础工具总结

除了本节内容中提到的基础故障处理工具外,JVM 中还提供了诸如安全管理、远程调用、项目部署、性能监控、国际化等各种各样的实用工具。
JDK 工具一览_jdk工具一览表_看山的博客-CSDN博客

可视化故障处理工具

JDK 中提供了大量的命令行工具可以帮助开发者快速进行故障排查与处理,同时也还提供了几个功能集成度更高的可视化工具,它们分别是:JConsole、JHSDB、VisualVM 和 JMC。其中,JConsole 和 JHSDB 伴随着 JDK 一同发布,VisualVM 虽然从 OracleJDK 中分离出来,但仍然可以免费下载使用,而 JMC 虽然开源,但是需要付费才能够使用其商业特性。

JHSDB - 基于服务型代理的调试工具

JDK 中提供了 JCMD 和 JHSDB 两个集成式的多功能的工具箱,他们几乎整合了前文中提到的所有基础故障处理工具,并且在功能上还更加强大。
JHSDB(Java HotSpot Debugger) 是 Java HotSpot VM 的调试工具,可以用于分析和诊断 Java 程序。
可使用如下命令进入 JHSDB 图像化模式:

jhsdb hsdb --pid [pid]

JConsole - Java 监视与管理控制台

JConsole 是一款基于 JMX 的可视化监视、管理工具。它的主要功能是通过 JMX 的 MBean 对系统进行信息收集和参数动态调整。

  1. 启动 JConsole

  2. 内存监控

  3. 线程监控

VisualVM - 多合一故障处理工具

  1. VisualVM 兼容范围与插件安装

  2. 生成、浏览转储快照

  3. 分析程序性能

  4. BTrace 动态日志跟踪

JMC - 可持续在线的监控工具

JMC(Java Mission Control)

HotSpot 虚拟机插件及工具

调优案例

这一部分案例主要是从《深入理解 JAVA 虚拟机》书中内容整理而来,后续若是在文档整理或者深入学习过程中,有遇到相关案例,也会实时更新到这一部分中。

版权声明

本文链接:https://www.chinmoku.cc/java/advanced/jvm-tutorial-2/

本博客中的所有内容,包括但不限于文字、图片、音频、视频、图表和其他可视化材料,均受版权法保护。未经本博客所有者书面授权许可,禁止在任何媒体、网站、社交平台或其他渠道上复制、传播、修改、发布、展示或以任何其他方式使用此博客中的任何内容。

Press ESC to close