一些JDK自带的性能分析利器

本文介绍了Java性能分析的一系列工具,包括jps、jstat、jinfo、jmap、jhat和jstack,以及jConsole和VisualVM。这些工具能帮助开发者诊断CPU飙升、程序卡死等问题,提供线程堆栈信息、内存使用、垃圾收集统计等关键数据。通过命令行工具可以实时监控和分析JVM状态,而jConsole和VisualVM则提供了更直观的可视化界面,便于理解程序运行情况和定位问题。

有时候碰到服务器CPU飙升或者程序卡死之类的问题,一般都不太好定位。这类bug一般都隐藏的比较深并且还可能是偶发性的,比较棘手。

对于此类问题,一般我们都有固定的分析流程。借助于JDK自带的一些分析工具,比如jstack、jmap、jstat一类的命令行工具,除此之外,还有jconsole、mat、jvisualvm这些图形界面分析工具。

这篇文章基于JDK8,操作系统是macOS 12.0.1

1、一些命令行分析工具

这些命令行分析工具都在jdk/bin目录下

image-20220316160402785-7417844.png

解压jdk/lib/tool.jar可以得到上述工具的class文件

image-20220316160755917-7418077.png

1.1 jps - JVM Process Status Tool

作用:列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。

image-20220316193716333-7430637.png

第一个参数说明:

  • -q:默认携带的参数,显示进程ID。

  • -m:显示进程ID,主类名称,以及传入main方法的参数。

  • -l:显示进程ID,主类全名。

  • -v:显示进程ID,主类名称,以及传入JVM的参数。

  • -V:显示进程ID,主类名称。

[-mlvV]可以任意组合使用。

第二个参数说明:

  • hostid:服务器的ip地址。不指定的情况下,默认为当前服务器。如果要查看其他机器上的JVM进程,需要在待查看机器上启动jstatd。
1.2 jstat - JVM Statistics Monitoring Tool

作用:监视虚拟机各种运行状态信息,可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

命令格式:jstat - [-t] [-h] [ []]

参数说明

第一个参数:option,代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译情况。具体选项如下:

  • -class:显示有关类加载器行为的统计信息。

  • -compiler:显示有关java hotspot vm即时编译器行为的统计信息。

  • -gc:显示有关垃圾收集堆行为的统计信息。

  • -gccapacity:显示有关各个垃圾回收代容量及其相应容量的统计信息。

  • -gccause:显示有关垃圾收集统计信息(同-gcutil),以及上一次和当前垃圾收集事件的原因。

  • -gcnew:显示新生代行为的统计信息。

  • -gcnewcapacity:显示有关新生代大小及其相应空间的统计信息。

  • -gcold:显示老年代行为的统计信息和元空间统计信息。

  • -gcoldcapacity:显示有关老年代大小的统计信息。

  • -gcmetacapacity:显示有关元空间大小的统计信息。

  • -gcutil:显示有关垃圾收集统计信息。

  • -printcompilation:显示java hotspot vm编译方法统计信息。

第二个参数:vmid。如果是本地虚拟机进程,那么vmid和本地虚拟机唯一ID是一致的。如果是远程虚拟机进程,那么vmid的格式是:protocol:lvmid[@hostname[:port]/servername]

第三个参数:interval。采样间隔,单位为s或ms,默认单位是ms,必须为整数。指定该参数,jstat命令将在每个间隔产生输出。

第四个参数:count。要显示的样本数。

import java.io.IOException;

/**
 * -class:
 *  Loaded:已加载的类数量。
 *  Bytes:已加载的kb数。
 *  Unloaded:卸载的类数量。
 *  Bytes:卸载的kb数。
 *  Time:执行类加载和卸载的耗时。
 *
 * -compiler:
 *  Compiled:执行的编译任务数。
 *  Failed:编译失败的任务数。
 *  Invalid:无效的编译任务数。
 *  Time:执行编译任务所花费的时间。
 *  FailedType:失败的编译类型。
 *  FailedMethod:失败的编译类名和方法。
 */
public class Demo1_jstat {
    public static void main(String[] args) throws IOException {
        System.out.println("jstat");
        System.in.read();
    }
}

启动上面的demo后

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值