返回

深入浅析JVM监控及诊断工具——命令行篇

后端

前言

Java虚拟机(JVM)是Java语言的运行环境,它负责执行Java字节码并管理Java应用程序的内存。JVM监控和诊断工具是用于监控和诊断JVM运行状况的软件工具,它们可以帮助我们及时发现和解决JVM问题,确保应用程序的稳定运行。

命令行JVM监控及诊断工具

1. jps

jps工具用于查看正在运行的Java进程。它可以显示每个Java进程的进程ID(PID)、进程名称和主类。

基本情况

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

使用示例

jps

输出结果:

12345 Main
12346 Jps

2. jstack

jstack工具用于生成Java进程的堆栈转储。堆栈转储是Java线程在某个特定时刻的堆栈信息,它可以帮助我们分析线程的执行情况和定位问题。

基本情况

jstack:用于生成Java进程的堆栈转储,可以dump出Java线程的堆栈信息(包括Java和Native调用栈)。

使用示例

jstack <pid>

输出结果:

"main" #1 prio=5 os_prio=31 tid=0x00007f39694d9800 nid=0x304 runnable [0x00007f396f4ec000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:244)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:285)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    - locked <0x00007f396fb48d68> (a java.io.BufferedInputStream)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:716)
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:693)
    at sun.net.www.http.HttpClient.get(HttpClient.java:409)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1879)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1474)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
    at sun.net.www.protocol.http.HttpURLConnection.getResponseCode(HttpURLConnection.java:444)
    at javax.swing.text.html.HTMLEditorKit.readURLConnectionToDocument(HTMLEditorKit.java:367)
    at javax.swing.text.html.HTMLEditorKit.read(HTMLEditorKit.java:313)
    at javax.swing.text.html.HTMLEditorKit.createDefaultDocument(HTMLEditorKit.java:153)
    at javax.swing.JEditorPane.getDocument(JEditorPane.java:1836)
    at javax.swing.JEditorPane.setContentType(JEditorPane.java:1677)
    at sun.plugin2.applet.Plugin2Manager.createAppletViewer(Plugin2Manager.java:1357)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:1261)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1834)
    at java.lang.Thread.run(Thread.java:748)

3. jmap

jmap工具用于查看Java进程的内存使用情况。它可以显示Java堆内存、非堆内存、类加载器内存和本地代码内存的使用情况。

基本情况

jmap:用于查看Java进程的内存使用情况,可以查询Java进程的内存信息。

使用示例

jmap -heap <pid>

输出结果:

#============================================================================
#Heap
 cmd_line_flags:  -XX:InitialHeapSize=1073741824 -XX:MaxHeapSize=2147483648 -XX:NewSize=536870912 -XX:MaxNewSize=1073741824 -XX:-UseAdaptiveSizePolicy -Xms256m -Xmx1g -XX:MaxPermSize=128m -Xss256k -XX:ThreadStackSize=1024 -XX:+HeapDumpOnOutOfMemoryError -Dspring.profiles.active=qa
 #============================================================================

#Heap
 PSYoungGen      total 549760K, used 213622K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 eden space 460800K, 32% used [0x00000000ff600000,0x00000000ff9874d0,0x00000000ffab0000)
 from space 88960K, 100% used [0x00000000ffe00000,0x00000000ffec53b8,0x00000000fff80000)
 to   space 88960K, 0% used [0x00000000ffec53b8,0x00000000ffec53b8,0x0000000100000000)
 PSOldGen       total 1597696K, used 101586K [0x00000000f5b00000, 0x00000000ff600000, 0x00000000ff600000)
 object space 1597696K, 6% used [0x00000000f5b00000,0x00000000f65191f0,0x00000000ff600000)
 PSPermGen      total 122880K, used 90381K [0x00000000f2e00000, 0x00000000f5b00000, 0x00000000f5b00000)
 object space 122880K, 73% used [0x00000000f2e00000,0x00000000f3719380,0x00000000f5b00000)

4. jhat

jhat工具用于生成Java进程的堆转储快照。堆转储快照是Java堆内存的静态副本,它可以帮助我们分析堆内存的使用情况和定位内存泄漏问题。

基本情况

jhat:用于生成Java进程的堆转储快照,可以分析Java堆内存的使用情况,并可用于定位内存泄漏问题。

使用示例

jhat <dump_file>

输出结果: