- 概述
- 工具分类:JDK自带的故障处理工具可分为商业授权工具(如JMC及JFR)、正式支持工具和实验性工具。
- 工具特点
- 体积小:大多数工具体积在21KB左右,功能代码实现在JDK的工具类库中。
- 实现方式:这些工具大多基于Java语言实现,方便在应用程序中提供监控分析功能。
- 基础故障处理工具
- jps:虚拟机进程状况工具,可列出正在运行的虚拟机进程,显示主类名称和本地虚拟机唯一ID,还能通过RMI协议查询远程虚拟机进程状态。
- jstat:虚拟机统计信息监视工具,用于监视虚拟机各种运行状态信息,如类加载、内存、垃圾收集、即时编译等,可显示本地或远程虚拟机进程的相关数据。
- jinfo:Java配置信息工具,可实时查看和调整虚拟机各项参数,还能打印虚拟机进程的System.getProperties()内容。
- jmap:Java内存映像工具,用于生成堆转储快照,可查询finalize执行队列、Java堆和方法区的详细信息。
- jhat:虚拟机堆转储快照分析工具,与jmap搭配使用,内置微型HTTP/Web服务器,可在浏览器中查看堆转储快照的分析结果。
- jstack:Java堆栈跟踪工具,用于生成虚拟机当前时刻的线程快照,可用于定位线程长时间停顿的原因。
- 可视化故障处理工具
- JHSDB
- 功能特点:基于服务性代理的调试工具,可在进程外调试虚拟机,通过服务性代理API分析其他HotSpot虚拟机的内部数据或内存转储快照。
- 实验演示:通过分析一个简单的测试代码,演示了如何使用JHSDB查找对象在内存中的位置和引用关系,验证了对象在Java堆、方法区等区域的存储情况。
- JConsole
- 功能概述:Java监视与管理控制台,基于JMX实现,可对系统进行信息收集和参数动态调整。
- 使用场景
- 内存监控:可视化展示虚拟机内存的变化趋势,可帮助分析内存使用情况和垃圾收集行为。
- 线程监控:用于分析线程的状态和活动,可帮助定位线程停顿和死锁问题。
- VisualVM
- 功能强大:多合一故障处理工具,具有显示虚拟机进程信息、监视应用程序性能、分析堆转储快照、进行性能分析等功能。
- 特色功能
- 插件扩展:基于NetBeans平台开发,可通过插件扩展功能,支持多种功能,如生成和浏览堆转储快照、进行方法级的性能分析等。
- BTrace动态日志跟踪:通过HotSpot虚拟机的Instrument功能,在不中断目标程序运行的前提下,动态加入调试代码,可用于排查问题和性能监视。
- Java Mission Control
- 简介:可持续在线的监控工具,曾是BEA公司的产品,后被Oracle融合进OracleJDK,可通过JMX协议与虚拟机通信,展示虚拟机和应用程序的运行数据。
- 工作原理:使用JFR记录虚拟机运行时的数据,JMC作为分析工具展示这些数据,提供对内存、代码、线程等方面的监控和分析功能。
- JHSDB
- HotSpot虚拟机插件及工具
- HSDIS:JIT生成代码反汇编插件,可让HotSpot的-XX:+PrintAssembly指令调用它来把即时编译器动态生成的本地代码还原为汇编代码输出,并自动产生注释,有助于分析程序的执行过程和性能问题。
扩展内容
在实际的开发和运维工作中,熟练掌握这些故障处理工具是非常重要的。例如,当应用程序出现性能瓶颈或内存泄漏问题时,可以使用jstat和jmap等工具来监测虚拟机的运行状态和内存使用情况,通过分析堆转储快照和线程堆栈信息,能够快速定位问题的根源,并采取相应的优化措施。同时,JHSDB、JConsole和VisualVM等可视化工具可以帮助开发人员更直观地了解应用程序的内部运行情况,及时发现和解决潜在的问题。此外,随着Java技术的不断发展,这些工具也在不断更新和完善,开发人员应及时了解和学习新的工具和功能,以更好地应对不断变化的开发和运维需求。
以下是使用jstat和jmap等工具来监测虚拟机的运行状态和内存使用情况的实际操作步骤:
- 准备工作
- 环境要求:确保已经安装了JDK,并且可以在命令行中访问jstat和jmap命令。
- 选择监测对象:确定要监测的虚拟机进程,可以使用jps命令查看正在运行的Java进程ID。
- 使用jstat工具
- 基本用法:jstat是用于监视虚拟机各种运行状态信息的命令行工具,其基本语法为
jstat [option vmid [interval[s|ms] [count]] ]
。 - 常见参数
- 选项:常用的选项包括
-gc
(查看垃圾收集信息)、-class
(查看类加载信息)等。 - VMID:本地虚拟机进程的VMID与LVMID一致,远程虚拟机进程的VMID格式为
[protocol:][//]lvmid[@hostname[:port]/servername]
。 - 间隔和次数:可以指定查询的间隔时间(
interval
)和次数(count
),如果省略这两个参数,只查询一次。
- 选项:常用的选项包括
- 实际监测示例
- 查看内存使用情况:例如,要每隔250毫秒查询一次进程2764的垃圾收集状况和内存使用情况,共查询20次,可以使用命令
jstat -gc 2764 250 20
。 - 分析结果:查询结果会显示新生代、老年代、永久代等的使用情况,以及垃圾收集的次数和耗时。
- 查看内存使用情况:例如,要每隔250毫秒查询一次进程2764的垃圾收集状况和内存使用情况,共查询20次,可以使用命令
- 基本用法:jstat是用于监视虚拟机各种运行状态信息的命令行工具,其基本语法为
- 使用jmap工具
- 生成堆转储快照
- 命令:使用
jmap -dump:format=b,file=filePath vmid
命令可以生成堆转储快照,其中filePath
是指定的快照文件路径,vmid
是要监测的虚拟机进程ID。 - 触发时机:可以在程序出现内存溢出异常时,使用
-XX:+HeapDumpOnOutOfMemoryError
参数让虚拟机自动生成堆转储快照,以便后续分析。
- 命令:使用
- 查看详细信息
- 其他选项:jmap还有一些其他选项,如
-histo
(查看类的实例数量和空间占用统计)等,可以在不同操作系统中使用。 - 分析快照:生成堆转储快照后,可以使用jhat等工具对快照进行分析,查看对象的创建和销毁情况、内存泄漏的位置等。
- 其他选项:jmap还有一些其他选项,如
- 生成堆转储快照
- 综合分析与应用
- 结合使用:可以结合jstat和jmap的输出信息,全面了解虚拟机的运行状态和内存使用情况。
- 问题定位:根据监测结果,分析内存使用的趋势和异常情况,定位可能存在的内存泄漏或性能问题的根源。
- 优化建议:基于监测和分析的结果,制定相应的优化策略,如调整内存参数、优化代码结构、改进算法等,以提高应用程序的性能和稳定性。
通过使用jstat和jmap等工具,可以有效地监测虚拟机的运行状态和内存使用情况,及时发现和解决潜在的问题,为应用程序的优化和稳定运行提供有力支持。