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 - 博客园
                              相关文章
                              |
                              19天前
                              |
                              监控 Java 测试技术
                              Java开发现在比较缺少什么工具?
                              【10月更文挑战第15天】Java开发现在比较缺少什么工具?
                              30 1
                              |
                              10天前
                              |
                              Java 数据格式 索引
                              使用 Java 字节码工具检查类文件完整性的原理是什么
                              Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
                              |
                              10天前
                              |
                              Java API Maven
                              如何使用 Java 字节码工具检查类文件的完整性
                              本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
                              |
                              13天前
                              |
                              Web App开发 Java
                              使用java操作浏览器的工具selenium-java和webdriver下载地址
                              【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
                              |
                              1月前
                              |
                              Java 流计算
                              Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
                              Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
                              35 1
                              Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
                              |
                              1月前
                              |
                              JavaScript 前端开发 Java
                              jvm的jshell,学生的工具
                              本文介绍了JVM的jshell工具,它为Java平台添加了REPL(读取-评估-打印循环)功能,使得学习、探索编码和原型代码变得更加便捷,但作者认为其在实际开发中较为鸡肋。
                              29 1
                              jvm的jshell,学生的工具
                              |
                              14天前
                              |
                              存储 算法 Java
                              Java虚拟机(JVM)的内存管理与性能优化
                              本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
                              |
                              14天前
                              |
                              Arthas 监控 数据可视化
                              JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
                              本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
                              |
                              23天前
                              |
                              存储 监控 算法
                              JVM调优深度剖析:内存模型、垃圾收集、工具与实战
                              【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
                              45 2
                              |
                              25天前
                              |
                              小程序 Oracle Java
                              JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
                              这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
                              34 0
                              JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用