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 - 博客园
                              相关文章
                              |
                              2月前
                              |
                              人工智能 缓存 监控
                              使用LangChain4j构建Java AI智能体:让大模型学会使用工具
                              AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
                              902 1
                              |
                              1月前
                              |
                              人工智能 监控 Java
                              Java与AI智能体:构建自主决策与工具调用的智能系统
                              随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
                              371 4
                              |
                              2月前
                              |
                              人工智能 Java API
                              Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
                              随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
                              979 8
                              |
                              7月前
                              |
                              监控 Java Unix
                              6个Java 工具,轻松分析定位 JVM 问题 !
                              本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
                              1008 4
                              |
                              6月前
                              |
                              机器学习/深度学习 消息中间件 存储
                              【高薪程序员必看】万字长文拆解Java并发编程!(9-2):并发工具-线程池
                              🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的强力并发工具-线程池,废话不多说让我们直接开始。
                              249 0
                              |
                              5月前
                              |
                              Java 数据安全/隐私保护 计算机视觉
                              银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
                              本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
                              |
                              5月前
                              |
                              安全 Java 编译器
                              JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
                              Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
                              2952 1
                              |
                              Java
                              java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
                              java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
                              237 9
                              |
                              5月前
                              |
                              Java 数据安全/隐私保护
                              银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
                              本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。
                              |
                              11月前
                              |
                              人工智能 自然语言处理 Java
                              FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
                              FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
                              2521 65
                              FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
                              下一篇
                              oss云网关配置