JDK自带的JVM监控和诊断工具

JVM监控和诊断工具

简单命令行工具

1、javac和java指令
  1. 作用:
  2. 位置:在jdk的安装目录下面的bin目录下
2、jps:查看正在运行的java进程

在这里插入图片描述

参数:

  • -q 只显示进程id
  • -l 显示全类名(如果是jar包,jar包会完整路径)
  • -m 输出启动时传递给启动类main()的参数 String[] args;
  • -v 打印每一个的进程JVM参数的详细信息
  • hostid 远程访问,需要安装jstatd
3、jstat:查看JVM统计信息
3.1、什么是jstat?

参数:

  • -class pid 显示ClassLoader的信息
    在这里插入图片描述

    • 信息说明:
      • Loaded: 已完成加载类的总数量
      • Bytes: 已加载类的字节数
      • Unloaded: 未完成加载的类数量
      • Bytes: 未完成加载的类数量的字节数
      • Time: 加载完成的时间
  • -gc pid

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tl2qvqHv-1678601075037)(D:\资料\java总资料\JAVA笔记\博文笔记\图片\image-20230309090620711.png)]

    • SOC: Survivor0的当前剩余空间

    • SIC:Survivor1的当前剩余空间

    • SOU : Survivor0的使用空间

    • SIU:Survivor1的使用空间

    • EC:Eden的剩余空间

    • EU:Eden的使用空间

    • OC:Old的剩余空间

    • OU:Old的使用空间

    • MC:Metaspace的总空间

    • MU:Metaspace的剩余空间

    • CCSC:压缩类空间容量

    • CCSU:使用的压缩类空间

    • YGC:YGC垃圾收集的数量

    • YGCT:YGC执行的时间

    • FGC: Full GC垃圾收集的数量

    • FGCT:Full GC执行的时间

    • GCT: GC的总时间

  • -compiler pid 即时编译器的一些参数

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5rEFOtY-1678601252203)(D:\资料\java总资料\JAVA笔记\博文笔记\图片\image-20230309092947543.png)]

    • compiled:执行的编译任务数

    • Failed:执行编译失败的数量

    • Invaild:编译的失效的数量

    • Time:即时编译的总时间

    • FailedType: 失败类的类型

    • FailedMethod: 失败的类的方法

  • -gccapacity pid 内存池生成和空间容量

  • 其他见官网

3.2、jstat有什么作用?

1)查看有关jvm的相关参数(GC详细,堆栈空间详细以及元空间的空间数据)

2)可以判断出现内存泄漏

  1. 在长时间的运行java程序中,我们可以运行jstat命令连续获取多行性能数据,并取几行数据的OU列的最小值(已占用的老年代内存)
  2. 重复多次,获取多组OU的最小值。如果呈现上升趋势,则可以说明老年代占用的,意味着无法回首的对象在不断增加,很可能出现内存泄漏。
4、jinfo:实时查看和修改 JVM 配置参数
4.1、有什么用?
  1. 查看虚拟机的配置信息
  2. 调整虚拟机的配置参数
4.2、命令结构
jinfo [选项] pid

在这里插入图片描述

  • jinfo -sysprops pid
    • 输出系统属性
  • -flags pid
    • 输出全部的参数
  • -flag name=value pid
    • 动态设置jvm参数
  • info pid
    • 默认打印全部的信息
  • -flag name
    • 输出对应名称的参数
  • -flag [±]name
    • 开启或者关闭对应名称的参数
    • 只有被标记为 manageable 的参数才可以被动态修改
4.3、查看所有的JVM启动初始值
java -XX:+PrintFlagsInitial
4.4、插卡所有参数的最终值
java -XX:+PrintFlagsFinal
4.5、查看哪些已经被用户或者 JVM 设置过的详细的 XX 参数的名称和值
java -XX:+PrintCommandLineFlags
5、jmap:导出内存映像文件和查看内存使用情况
5.1、官方文档
5.2、使用语法
jmap [option] pid
jmap [option] <executable <core>
jmap [option] [server_id@] <remote server IP or hostname>
5.3、常用命令
  • -dump 生成dump文件(java堆转储快照)

    • -dump:live只保存堆中的存活对象

在这里插入图片描述

6、jhat:jdk自带堆分析工具

6.1、命令

jhat <option> <dumpfile>
  • -port port-number
    • 设置 jhat HTTP Server 的端口号,默认 7000

在这里插入图片描述

访问http://localhost:7000/

7、jsatck:打印JVM中的线程快照

官方文档

7.1、用途
  1. 追踪虚拟机的堆栈。
  2. 生成线程快照,用于定位线程出现长时间停顿的原因。如线程间死锁,死循环,请求外部资源导致的长时间等待
7.2、参数说明
option 参数作用
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的附加信息
-m如果调用本地方法的话,可以显示 C/C++的堆栈
7.3、实践——使用jstack来查看死锁

1)编写代码

public class TestDeadLock {

    public static void main(String[] args) {
        //测试死锁现象,使用jstack查看死锁
        Object o1 = new Object();
        Object o2 = new Object();
        new Thread(() -> {
           synchronized (o1) {
               try {
                   System.out.println("t1拿到了o1");
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }

               synchronized (o2) {
                   System.out.println("t1拿到了o2");
               }
           }
        }).start();

        new Thread(() -> {
            synchronized (o2) {
                try {
                    System.out.println("t2拿到了o2");
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (o1) {
                    System.out.println("t2拿到了o1");
                }
            }
        }).start();
    }

}

2)使用jps查看pid

3)jstack pid

在这里插入图片描述
在这里插入图片描述

在thread dump留意

  • 死锁 DeadLock
  • 等待资源 Waiting on condition
  • 等待获取监视器,Waiting on monitor entry
  • 阻塞,Blocked
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待中,Object.wait() 或 TIMED_WAITING
  • 停止,Parked
8、jcmd多功能命令行

官方帮助文档

8.1、作用
  • 实现前面除了 jstat 之外所有命令的功能
  • 用它来导出堆、内存使用、查看 Java 进程、导出线程信息、执行 GC、JVM 运行时间等。

8.2、命令

  • jcmd -l
    • 列出所有的JVM进程
  • jcmd pid 具体命令
9、jstatd:远程主机信息收集
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值