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 - 博客园
                              相关文章
                              |
                              4天前
                              |
                              存储 Java 数据安全/隐私保护
                              【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
                              【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
                              39 0
                              |
                              4天前
                              |
                              监控 安全 Java
                              Java基础知识:解释一下Java虚拟机(JVM)是什么。
                              Java基础知识:解释一下Java虚拟机(JVM)是什么。
                              43 3
                              |
                              4天前
                              |
                              存储 Java
                              深入理解Java虚拟机:JVM内存模型
                              【4月更文挑战第30天】本文将详细解析Java虚拟机(JVM)的内存模型,包括堆、栈、方法区等部分,并探讨它们在Java程序运行过程中的作用。通过对JVM内存模型的深入理解,可以帮助我们更好地编写高效的Java代码,避免内存溢出等问题。
                              |
                              4天前
                              |
                              缓存 算法 安全
                              【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
                              【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
                              23 0
                              |
                              4天前
                              |
                              缓存 Java C#
                              【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
                              【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
                              92 0
                              |
                              4天前
                              |
                              Linux Windows
                              FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
                              FinalShell连接Linux虚拟机报错java.net.ConnectException: Connection timed out: connect(亲测有效)
                              218 0
                              |
                              4天前
                              |
                              存储 Java 开发者
                              深入理解Java虚拟机(JVM)内存管理
                              【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
                              |
                              4天前
                              |
                              存储 算法 Java
                              Java虚拟机内存管理机制
                              【2月更文挑战第7天】本文主要介绍了Java虚拟机内存管理机制的基本原理和实现方式。Java虚拟机的内存管理机制是Java程序运行的重要组成部分,对程序性能和稳定性有着直接的影响。文章首先从Java虚拟机内存模型入手,介绍了Java虚拟机中堆内存、方法区、栈、PC寄存器等内存区域的功能特点和使用方式;然后详细阐述了Java虚拟机内存管理机制的垃圾回收算法和回收器的分类、优化和实现过程;最后介绍了一些常见的内存问题和优化技巧,以及如何通过代码调优和合理使用内存配置参数来提高程序的性能和稳定性。
                              |
                              4天前
                              |
                              安全 前端开发 Java
                              【JVM】<Java虚拟机>JVM架构&各种**虚拟机
                              【1月更文挑战第26天】【JVM】<Java虚拟机>JVM架构&各种**虚拟机
                              |
                              4天前
                              |
                              自然语言处理 Oracle Java
                              【JVM】<Java虚拟机>JVM和JAVA体系结构
                              【1月更文挑战第26天】【JVM】<Java虚拟机>JVM和JAVA体系结构

                              热门文章

                              最新文章