Java虚拟机-常用工具

简介: Java虚拟机-常用工具

 image.gif编辑

“工欲善其事必先利其器”。

一、命令行工具

1. jps

JVM Process Status Tool,显示虚拟机进程。这个命令的使用频率很高,当服务器上运行大量Java项目的时候,系统管理员会通过该命令来查看对应的进程是否启动。

用法jps [-q] [-mlvV]

参数说明

    • -q:打印进程号
    • -l:打印启动类的全限定名
    • -m:打印启动类的 main 方法入参
    • -v:打印指定的虚拟机参数
    • -V:打印类名

    例子jpsjps -l

    image.gif编辑

    2、jstat

    JVM statistics Monitoring,对Java虚拟机内存进行监控统计,包括类装载、内存、垃圾收集、JIT编译信息等。该命令通常与jps命令一起使用,先通过jps查看当前服务器上运行有哪些进程,获取到对应的进程号后再使用jstat来查看该进程的具体信息。

    用法jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

    参数说明

      • option:操作,参数比较多,常用的是gcutil,统计垃圾回收情况。
        • -class:监控类装载,卸载数量,总空间以及消费的时间
        • -gc:垃圾回收堆的行为统计(常用命令)  
        • -gccapacity:同-gc,同时还会输出JAVA堆各区域的使用到的最大、最小空间
        • -gcutil:同-gc,输出的是已使用空间占总空间的百分比
        • -gccause:在-gcutil的基础上附加最近两次垃圾回收时间的原因
          • -t:显示时间戳列
          • -h:指定多少行显示标题
          • -vmid:进程ID
          • -interval:每行输出的时间间隔
          • -count:指定输出行数

          例子jstat -gcutil -h2 -t 11904 100 5,表示监控进程号11904的垃圾收集统计值,每隔100ms输出一行,总共输出5次,每输出2次需要重新输出标题。

          D:\>jstat -gcutil -h2 -t 11904 100 5
          Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
                   1252.1   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
                   1252.2   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
          Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
                   1252.3   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
                   1252.5   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007
          Timestamp         S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
                   1252.6   0.00  76.18  87.85   0.01  96.10  93.02      1    0.007     0    0.000    0.007

          image.gif

          输出的指标说明

            • S0:survivor 0 已用空间占比
            • S1:survivor 1 已用空间占比
            • E:Eden 区已用空间占比
            • O:老年代已用空间占比
            • M:元数据已用空间占比
            • CCS:压缩类空间占比
            • YGC:Minor GC 次数
            • YGCT:Minor GC 消耗时间
            • FGC:Full GC 次数
            • FGCT:Full GC 消耗时间
            • GCT:垃圾回收消耗总时间

            元空间M就是永久代的替代产物。

            3. jinfo

            JVM Configuration info,可以实时查看和实时修改虚拟机参数。jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息

            用法jinfo [option] <pid>

            参数说明

              • option:操作

              -flag 打印指定的VM参数的值

              -flag [+|-] 启用或禁用指定的VM参数

              -flag = 修改VM参数

              -flags 打印VM参数

              -sysprops 打印Java系统配置

                • pid:进程ID

                例子

                #查看指定的进程是否使用了G1垃圾回收器
                D:\>jinfo -flag UseG1GC 11904
                -XX:-UseG1GC

                image.gif

                4. jmap

                JVM Memory Map,用来生成堆栈dump文件。可查看的信息如下:

                  • 查看堆各个对象的数量,大小
                  • dump堆里的对象信息,然后可以用MAT分析
                  • 查看堆的配置情况和GC算法
                  • 查看堆永久代信息

                  用法jmap [option] <pid>

                  参数说明

                    • option:操作

                    heap:打印Java堆摘要

                    histo[:live]:打印java对象堆的直方图; 如果指定了“live”选项,则仅计算实时对象

                    dump:生成dump快照

                      • pid:进程ID

                      例子

                      jmap -heap 15754
                      jmap -histo:live 15754
                      jmap -dump:live,file=.\heap_dump.hprof 15754

                      image.gif

                      5. jstack

                      用来生成Java虚拟机当前时刻的线程快照,方便定位线程长时间停顿的问题,比如死锁、死循环、长时间等待等。

                      用法jstack -F [-m] [-l] <pid>

                      参数说明

                        • -F:强制打印堆栈
                        • -m:同时打印Java和本地方法的堆栈
                        • -l:打印关于锁的附件信息
                        • pid:进程ID

                        例子

                        D:\>jstack -l 11904
                        2020-04-03 15:54:36
                        Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode):
                        "RMI TCP Connection(idle)" #36 daemon prio=5 os_prio=0 tid=0x000000001a27a000 nid=0x3bd0 waiting on condition [0x000000001c3ee000]
                           java.lang.Thread.State: TIMED_WAITING (parking)
                                at sun.misc.Unsafe.park(Native Method)
                                - parking to wait for  <0x00000000d0687c48> (a java.util.concurrent.SynchronousQueue$TransferStack)
                                at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
                                at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
                                at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
                                at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
                                at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073)
                                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
                                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
                                at java.lang.Thread.run(Thread.java:748)
                           Locked ownable synchronizers:
                                - None

                        image.gif

                        这个打印的信息跟我们在Java代码中使用Thread.getAllStackTraces()方法获取的内容是一致的。

                        6. jhat

                        JVM Heap Analysis Tool,用来分析jmap生成的堆栈日志,生成HTML文件。jhat命令对于内存和cpu的占用率非常高,通常不会在服务器上直接进行分析,而是拷贝到本地再进行分析。该命令执行完毕后会启动一个简易的HTTP服务,端口号是7000,本地可以通过http://localhost:7000访问,生成的html页面如下所示:

                        image.gif编辑

                        查看堆异常主要关注两个:

                          • Show instance counts for all classes (excluding platform) 平台外的所有对象信息
                          • Show heap histogram 先是堆的统计信息

                          这个命令功能非常强大,但使用率不是很高,我们一般会用可视化工具来分析堆栈日志,比如MAT。

                          7. jcmd

                          JDK建议使用 jcmd 替代 jstack、jinfo、jmap 等命令。

                          例子

                            • jcmd -l:列出所有Java虚拟机。
                            • jcmd 15754 help:列出该虚拟机支持的命令。
                            • jcmd 15754 PerfCounter.print:获取所有性能相关的数据。
                            • jcmd 15754 GC.class_histogram

                            二、可视化工具

                            jconsole:JDK自带监控工具:内存监控、线程监控、检测死锁

                            image.gif编辑

                            image.gif编辑

                            jvisualvm:JDK自带监控工具,比jconsole显示更多监控数据

                            image.gif编辑

                            jmc:也是JDK自带监控工具,比jvisualvm显示更多监控数据

                            image.gif编辑

                            MAT:Memory Analyzer Tool,Java虚拟机内存分析工具,能够快速的分析dump日志。

                            官网下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

                            image.gif编辑

                            三、虚拟机工具思维导图

                            image.gif编辑

                            参考资料:

                              1. Java虚拟机知识点【工具】 - O'Neal - 博客园
                              相关文章
                              |
                              1月前
                              |
                              Java
                              java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
                              java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
                              74 9
                              |
                              2月前
                              |
                              监控 Java 测试技术
                              Java开发现在比较缺少什么工具?
                              【10月更文挑战第15天】Java开发现在比较缺少什么工具?
                              39 1
                              |
                              29天前
                              |
                              SQL Java 索引
                              java小工具util系列2:字符串工具
                              java小工具util系列2:字符串工具
                              142 83
                              |
                              26天前
                              |
                              Java 开发者 微服务
                              Spring Boot 入门:简化 Java Web 开发的强大工具
                              Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
                              48 6
                              Spring Boot 入门:简化 Java Web 开发的强大工具
                              |
                              29天前
                              |
                              Java 数据库
                              java小工具util系列1:日期和字符串转换工具
                              java小工具util系列1:日期和字符串转换工具
                              56 26
                              |
                              1月前
                              |
                              Java
                              java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
                              java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
                              52 24
                              |
                              22天前
                              |
                              存储 监控 算法
                              深入探索Java虚拟机(JVM)的内存管理机制
                              本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
                              |
                              1月前
                              |
                              Arthas Prometheus 监控
                              监控堆外使用JVM工具
                              监控堆外使用JVM工具
                              39 7
                              |
                              29天前
                              |
                              数据采集 存储 监控
                              Java爬虫:数据采集的强大工具
                              在数据驱动的时代,Java爬虫技术凭借其强大的功能和灵活性,成为企业获取市场信息、用户行为及竞争情报的关键工具。本文详细介绍了Java爬虫的工作原理、应用场景、构建方法及其重要性,强调了在合法合规的前提下,如何有效利用Java爬虫技术为企业决策提供支持。
                              |
                              1月前
                              |
                              Java 数据格式 索引
                              使用 Java 字节码工具检查类文件完整性的原理是什么
                              Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
                              51 5