第二章:Jvm监控及诊断工具-命令行篇

本文详细介绍了Java的各种性能监控和分析工具,包括jps用于查看Java进程,jstat监测JVM统计信息,jinfo查看和修改虚拟机参数,jmap导出内存映像和堆信息,以及jhat和jstack进行堆分析和线程快照。这些工具在诊断和优化Java应用性能时发挥着关键作用,尤其在处理内存泄漏和线程问题时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jps

查看正在运行的 Java进程

显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。

说明: 对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。

参数

-q : 仅仅显示LVMID (local virtual machine id), 即本地虚拟机唯一id。不显示主类的名称等
-l: 输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径
-m: 输出虚拟机进程启动时传递给主类main()的参数
-v: 列出虚拟机进程启动时的JVM参数。 比如: -Xms20m -Xmx50m是启动程序指定的jvm参数。

说明: 以上参数可以综合使用。

补充: 如果某Java进程关闭了默认开启的UsePerfData参数(即使用参数-XX: -UsePerfData),那么jps命令(以及下面介绍的jstat)将无法探知该Java进程。

jstat

查看 JVM 统计信息

jstat(JVM Statistics Monitoring Tool): 用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据

在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虛拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。

官方文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

它的基本使用语法为:
jstat - [-t] [-h] [ < interval> [ ] ]

查看命令相关参数: jstat -h或jstat -help

interval 参数

用于指定输出统计数据的周期,单位为毫秒,即查询间隔、每个多长时间查询一次

jstat -class 14976 1000

每隔 1s 查询一次

1

count 参数

用于指定查询的总次数

2

-t 参数

可以在输出信息前加上一个 Timestamp列,显示程序的运行时间

image-20221030161759778

-h 参数

可以在周期性数据输出时,输出多少行数据时输出一个表头信息

3

option 参数

类装载相关的
-class: 显示ClassLoader的相关信息: 类的装载、卸载数量、总空间、类装载所消耗的时间等

垃圾回收相关的

  • -gc: 显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间GC时间合计等信息。

image-20221030165050887

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

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

  • -gccause:与-gcuti1功能一样,便是会额外输出导致最后一次或当前正在发生的GC产生的原因。

  • -gcnew: 显示新生代GC状况

  • -gcnewcapacity: 显示内容与-gcnew基 本相同,输出主要关注使用到的最大、最小空间

  • -geold: 显示老年代GC状况

  • -gcoldcapacity: 显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间

  • -gcpermcapacity:显示永久代使用到的最大、最小空间。

JIT相关的

  • -compiler: 显示JIT编译器编译过的方法、耗时等信息

image-20221030163118149

  • -printcompilation: 输出已经被JIT编译的方法

image-20221030163141856

jinfo

查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。

在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到Java虛拟机参数的当前值。

查看

jinfo -sysprops PID : 可以查看由 System.getProperties() 取得的参数

jinfo -flags PID : 查看曾经赋过值的一些参数

jinfo -flag 具体参数 PID : 查看某个 Java 进程的具体参数的值

修改

针对 boolean 类型: jinfo -flag [+|-] 具体参数 PID

针对非 boolean 类型: jinfo -flag 具体参数=具体参数 PID

JVM 支持实时修改的命令

image-20221030171509138

拓展

image-20221030184710916

jmap

导出内存映像文件&内存使用情况

jmap(JVM Memory Map[)

作用一方面是获取dump文件(堆转储快照文件,- 二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等。

开发人员可以在控制台中输入命令“jmap -he1p” 查阅jmap工具的具体使用方式和一些标准选项配置。

官方帮助文档: https://docs.oracle.com/en/java/javase/11/tools/jmap.html

基本使用语法为

  • jmap [option]
  • jmap [option] <executable |
  • jmap [option] [server_ id@]

option 参数

  • -dump : 生成 dump 文件。-dump:live 只保存堆中存活的对象
  • -heap : 输出整个堆空间的详细信息
  • -histo :输出堆中对象的统计信息,包括类、实力数量、合计容量,-histo:live 只统计堆中存活的对象
  • -permstat : 以ClassLoader为统计口径输出永久代的内存状态信息,仅linux/solaris平台有效
  • -finalizerinfo:显示在F-Queue中等待Finalizer线程执行finalize方法的对象,仅linux/solaris平台有效
  • -F:当虚拟机进程对-dump选项没有任何响应时,可使用此选项强制执行生成dump文件,仅linux/solaris平台有效
  • -h/-help:jmap工具使用的帮助命令
  • -J :传递参数给jmap启动的jvm

导出内存映像文件

手动的方式

jmap -dump:format=b,file= <filename.hprof>
jmap -dump:live,format=b,file= <filename.hprof>

image-20221030174451721

推荐使用带有 live 的生成方式

自动的方式

-XX:HeapDumpPath= <filename.hprof>

-XX:+ HeapDumpOnOutOfMemoryError

file :文件的位置

format=b:指定格式

当程序发生00M退出系统时,一些瞬时信息都随着程序的终止而消失,而重现00M问题往往比较困难或者耗时。此时若能在00M时,自动导出dump文件就显得非常迫切。

这里介绍一种比较常用的取得堆快照文件的方法,即使用:
-XX: +HeapDumpOnOutOfMemoryError: 在程序发生00M时,导出应用程序的当前堆快照。
-XX :HeapDumpPath: 可以指定堆快照的保存位置。

比如:
-Xmx100m -XX : +HeapDumpOnOutOfMemoryError -XX :HeapDumpPath=D: \m. hprof

显示堆内存相关信息

  • jmap -heap pid
  • jmap -histo pid

image-20221030175752962

JDK 自带堆分析工具

jhat(JVM Heap Analysis Tool)

Sun JDK 提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分 析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/,就可以在浏览器里分析。

说明: jhat 命令在JDK9、JDK10中已经被删除,官方建议用VisualVM代替。

image-20221030181147292

访问

image-20221030181136454

jstack(JVMStackTrace)

用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。

线程快照就是当前虛拟机内指定进程的每一条线程正在执行的方法堆栈的集合。生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。

官方帮助文档: https://docs.oracle.com/en/java/javase/11/tools/jstack.html

在 thread dump中,要留意下面几种状态 :

  • 死锁,Deadlock (重点关注)
  • 等待资源,Waiting on condition (重点关注)
  • 等待获取监视器, Waiting on monitor entry ( 重点关注)
  • 阻塞,Blocked ( 重点关注)
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,0bject.wait() 或TIMED_ WAITING
  • 停止,Parked

参数

image-20221030182948470

jcmd

在JDK 1.7以后,新增了一个命令行工具jcmd。
它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。

官方帮助文档: https://docs.oracle.com/en/java/javase/11/tools/jcmd.html

j md拥有jmap的大部分功能,并且在0rac1e的官方网站上也推荐使用jcmd命令代jmap命令

参数

image-20221030183748089

jstatd

远程主机信息收集

之前的指令只涉及到监控本机的Java应用程序,而在这些工具中,一些监控工具也支持对远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd工具。命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服 务器将本机的Java应用程序信息传递到远程计算机。
的官方网站上也推荐使用jcmd命令代jmap命令

参数

[外链图片转存中…(img-KQpPo1jx-1669212676464)]

jstatd

远程主机信息收集

之前的指令只涉及到监控本机的Java应用程序,而在这些工具中,一些监控工具也支持对远程计算机的监控(如jps、jstat)。为了启用远程监控,则需要配合使用jstatd工具。命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服 务器将本机的Java应用程序信息传递到远程计算机。



各位彭于晏,如有收获点个赞不过分吧…✌✌✌

Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲨瓜2号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值