JDK 自带了很多常用工具方面我们进行一些性能监控与调试

在Windows工具都在我们JDK的bin目标下,Linux依旧有相关的命令

JVM工具可按照使用形式进行分类

  • 命令行工具
    • jps
    • jstat
    • jinfo
  • 可视化工具

命令行工具

jps:JVM Process Status Tool 列出正在运行的虚拟机进程

jps [options] [hostid]

[options]:
-q:显示进程ID
-m:显示进程ID、主类名称、传入Main方法的命令行参数
-l:显示进程ID、主类全限定名(快速得知是什么项目)
-v:显示进程ID、主类名称、JVM参数
-V:显示进程ID、主类名称 (-V 等价于 默认不加options 的 jps)

options之间可以任意组合

[hostid]
hostname:port 例如:127.0.0.1:8080

jstat:JVM Statistics Monitoring Tool 监视虚拟机各种的运行状态信息( 类装载、内存、垃圾手机、JIT编译等)

jstat [options] [vmid] [interval] [count]

[options] 可以通过jstat -options 查看所有的options
-class:显示类加载的统计信息
-compiler:Java HotSpot VM 及时编译器统计信息
-gc:显示有关垃圾收集堆行为的统计信息
-gcutil:显示有关垃圾收集堆行为的统计信息的百分比
....

-class 

[vmid]
虚拟机进程ID  (可通过jps -l获得)  如果远程的虚拟机就需要 进程ID@IP:端口

[interval](可不穿,但是如果传递了count,建议传递采样间隔!)
采样间隔(默认单位是毫秒),单位可选秒或者毫秒(需要手动添加单位 如 30s就是30秒,300ms就是300毫秒)

[count](可不穿)
采样一共循环的次数
Loaded 类加载数、Bytes 加载的Kb数、Unloaded卸载类数、Bytes 卸载的Kb数、Time 执行类加载和卸载操作的时间
Compiled 执行编译的任务数、Failed 编译失败任务数、Invaild 无效的编译任务数、Time 执行的时间、FailedType 上次失败的编译类型、FailedMethod 上次失败的编译类名与方法
S0C与S1C分别是幸存区0与1的内存总容量、S0U与S1U 分别是幸存区0与1的内存使用情况、EC与EU表示eden区内存总容量与使用、OC与OU表示老年代总用量与使用情况、MC与MU表示原空间总用量与使用情况、CCSC与CCSU:压缩类空间容量,类压缩空间的使用情况、YGC与YGCT表示Young GC执行次数与与时间、FGC与FGCT:Full GC执行的次数与时间、GCT:总垃圾收集时间
S0与S1表示幸存区0与1内存使用占比、E与O与M依次表示Eden与老年代与元空间的内存使用占比、CCS表示类空间压缩使用内存占比、 YGC与YGCT表示Young GC执行次数与与时间、 FGC与FGCT:Full GC执行的次数与时间、GCT:总垃圾收集时间

jstat 查看堆内存 实验案例

其他方式:https://www.zanglikun.com/481.html#Heap_Memory

    //-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
    public static void main(String[] args) throws IOException {

        final int OneMB = 1024*1024;
        Byte[] b1 = new Byte[2*OneMB];
        System.out.println("JVM 已经使用2M 回车执行下一步");
        System.in.read();

        Byte[] b2= new Byte[2*OneMB];
        System.out.println("JVM 已经使用4M 回车继续执行下一步");
        System.in.read();

        Byte[] b3= new Byte[2*OneMB];
        System.out.println("JVM 已经使用6M 再次回车结束");
        System.in.read();

    }

下面是运行结果:

jstat -gc PID

# 查看GC使用百分比
jstat -gcutil PID
这是我使用Idea插件 VisualGC 记录的,放在这里方便理解jstat的使用

我们从图中可以清晰看出来,在b3 数组 new 出来之前,内存已经不容许new 出来之后的,所以 JVM 执行了一次GC。

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤