JVM监控及诊断工具-命令行下篇

660 阅读4分钟

“这是我参与更文挑战的第3天,活动详情查看: 更文挑战

上篇介绍了JVM监控及诊断工具-命令行上篇,接下来给大家简单介绍下JVM监控及诊断工具之命令行下篇。

一、jmap(导出内存映射文件&内存使用情况)

概述

  1. jmap(JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用、堆中对象的统计信息、类加载信息等。
  2. 开发人员可以在控制台中输入命令 jmap -help 查阅jmap工具的具体使用方式和一些标准选项配置。
  3. 官方帮助文档:docs.oracle.com/en/java/jav…

基本语法

jmap [option]

  1. -dump 生成Java堆转储快照:dump文件,特别的:-dump:live只保存堆中的存活对象。
  2. -heap 输出整个堆空间的详细信息,包括GC的使用、堆配置信息,以及内存的使用。
  3. -histo 输出堆中对象的统计信息,包括类、实例数量和合计容量,特别的:-histo:live只统计堆中的存活对象。
  4. -permstat 以ClassLoader为统计口径输出永久代的内存状态信息,仅linux/solaris平台有效。

导出内存映射文件

手动的方式

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

自动的方式

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>

显示堆内存相关信息

jmap -heap pid
jmap -histo

二、jhat(JDK自带堆分析工具)

概述

  1. jhat(JVM Heap Analysis Tool):Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。
  2. 使用了jhat命令,就启动了一个http服务,端口是7000,即http://localhost:7000/ 就可以在浏览器里分析。
  3. jhat命令在JDK9、JDK10中已经被删除,官方建议用VisualVM代替。

基本语法

jhat [option] [dumpfile]

option参数:-stack false|true

关闭|打开对象分配调用栈跟踪

option参数:-refs false|true

关闭|打开对象应用跟踪

option参数:-port port-number

设置jhat HTTP Server的端口号,默认7000

三、jstack(打印JVM中线程快照)

概述

  1. jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一个线程正在执行的方法堆栈的集合。
  2. 生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。
  3. 官方帮助文档:docs.oracle.com/en/java/jav…
  4. 在thread dump中,要留意下面几种状态
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait()或TIMED_WAITING
停止,Parked

基本语法

jstack option pid

option参数:-F

当正常输出的请求不被响应时,强制输出线程堆栈

option参数:-l

除堆栈外,显示关于所的附加信息

option参数:-m

如果调用到本地方法的话,可以显示C/C++的堆栈

option参数:-h

帮助操作

四、jcmd(多功能命令行)

概述

  1. 在JDK1.7以后,新增了一个命令行工具jcmd。它是一个多功能的工具,可以用来实现前面除了jstat之外所有命令的功能。比如:用它导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等。
  2. 官方文档:docs.oracle.com/en/java/jav…
  3. jcmd拥有jmap的大部分功能,并且在oracle的官方网站上也推荐使用jcmd命令代jmap命令。

基本语法

jcmd -l

列出所有的JVM进程

jcmd pid help

针对指定的进程,列出支持的所有命令

jcmd pid 具体命令

显示指定进程的指令命令的数据

五、总结

这节主要介绍了JVM自带的监控诊断命令,只能简单的分析,对于复杂的业务需要专业的分析工具,下一篇介绍JVM监控及诊断工具-GUI篇。

欢迎大家关注公众号(MarkZoe)互相学习、互相交流。