JVM监控及诊断工具-命令之jstat

一、jps (Java Process status)查看正在运行的Java进程

启动如下程序:

参数:

  • -q: 仅显示ID

  • -l 输出程序的全限定名

  • -m 输出进程启动时传递给main的参数

  • -v 列出JVM参数

通过jps名称查看进程详细信息:

1、jps

 2、jps -q

 3、jps -l

 4、jps -m   

     在idea上添加参数

 

5、jps -v

  在idea上设置一下jvm参数  

注意:

​ 如果Java进程关闭了默认开启的UserPerfData参数,则jps无法探测。

在idea上配置 -XX:-UsePerfData

可以发现上面看不到JpsTest的进程了


二、jstat 查看JVM统计信息

1、简介

jstat( JVM Statistics Monitoring TooL):

        用于监视虛拟机各种运行状态信息的命令行工具。它可以是示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

        在没有GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题


2、命令:jstat -class 进程id

        显示ClassLoader的相关信息 ,测试程序依旧使用上面的程序JpsTest

  • Loaded : 已经装载的类的数量
  • Bytes : 装载类所占用的字节数
  • Unloaded:已经卸载类的数量
  • Bytes:卸载类的字节数
  • Time:装载和卸载类所花费的时间

3、命令:jstat -gc 进程id, 显示与GC相关的堆信息

显示gc相关的堆信息,查看gc的次数,及执行时间

  • S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  • S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  • S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  • S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  • EC :年轻代中Eden(伊甸园)的容量 (字节)
  • EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
  • OC :Old代的容量 (字节)
  • OU :Old代目前已使用空间 (字节)
  • MC:metaspace(元空间)的容量 (字节)
  • MU:metaspace(元空间)目前已使用空间 (字节)
  • YGC :从应用程序启动到采样时年轻代中gc次数
  • YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
  • FGC :从应用程序启动到采样时old代(全gc)gc次数
  • FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
  • GCT:从应用程序启动到采样时gc用的总时间(s)

4、interval 指定更新统计数据的周期,单位ms 每隔n毫秒输入一次

     注意:上面的-class以及-gc都可以添加interval参数,持续打印,例如我们打印-class

     jstat -class 5064 1000  表示每个1秒打印一次,便于我们持续的去监控

 当然我们也可以指定打印的次数,添加count参数,比如打印10次

 jstat -class 5064 1000 10  表示每个1秒打印一次,共打印10次


5、-t 表示在输出信息前加时间戳 表示程序的运行时间 单位 s

jstat -class -t 5064 1000 10 表示每个1秒打印一次,共打印10次,并且前面加上日期


6、-h 表示多少行内容之后输入一次表头信息

jstat -class -t -h5 5064 1000 10 表示每个1秒打印一次,共打印10次,并且前面加上日期,5行内容之后输入一次表头信息


7、jstat -compiler [pid]  显示VM实时编译(JIT)的数量等信息

命令:jstat -compiler 5064

  • Compiled:编译任务执行数量
  • Failed:编译任务执行失败数量
  • Invalid :编译任务执行失效数量
  • Time :编译任务消耗时间
  • FailedType:最后一个编译失败任务的类型
  • FailedMethod:最后一个编译失败任务所在的类及方法

8、jstat -printcompilation [pid] ,当前VM执行的信息

命令:jstat -printcompilation 5064

  • Compiled :编译任务的数目
  • Size :方法生成的字节码的大小
  • Type:编译类型
  • Method:类名和方法名用来标识编译的方法。类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的

三、最佳实践

1、使用gc查看程序一段时间内的gc情况,以及是否存在内存溢出的风险

1.1、首先我们创建一个测试程序,如下:

package com.kgf.kgfjavalearning2021.jvm;

import java.util.ArrayList;

/***
 * 测试GC的频率:
 * 设置内存大小:-Xmx60m -XX:SurvivorRatio=8
 *
 * -Xmx60m: 表示是最大堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你
 * -XX:SurvivorRatio=8:
 *      设置新生代中eden和S0/S1空间的比例
 *      默认
 *          -XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
 *      假如
 *          -XX:SurvivorRatio=4,Eden:S0:S1=4:1:1
 *          SurvivorRatio值就是设置Eden区的比例占多少,S0/S1相同
 *
 */
public class GCTest {

    public static void main(String[] args) {

        ArrayList<byte[]> list = new ArrayList<>();

        for (int i = 0; i < 1000; i++) {
            byte[] arr = new byte[1024*100];//每次向list中存放100kb的字节数组
            list.add(arr);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

设置堆内存内存最大60M,那么各自区域所占的内存如下:

新生代+老年代=60m

新生代 : 老年代 = 1:2

新生代:20M

老年代:40M

新生代 = Eden+S0+S1 = 20M

Eden:S0:S1 = 8:1:1

所以最后结果如下:

Eden:16M
S0: 2M
S1:2M

在idea中设置堆内存:

 启动程序,使用jstat命令查看:

命令:jstat -gc -t 2504 1000 30 表示表示每个1秒打印一次,共打印30次,并且前面加上日期

C:\Users\86136>jps
13524 Jps
5252
12664 KotlinCompileDaemon
2504 GCTest
4904 Launcher
7100 RemoteMavenServer

C:\Users\86136>jstat -gc -t 2504 1000 30
Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
           19.0 2048.0 2048.0  0.0   2032.2 16384.0   5759.2   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           20.0 2048.0 2048.0  0.0   2032.2 16384.0   6567.6   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           21.0 2048.0 2048.0  0.0   2032.2 16384.0   7376.1   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           22.0 2048.0 2048.0  0.0   2032.2 16384.0   8184.5   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           23.1 2048.0 2048.0  0.0   2032.2 16384.0   9397.2   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           24.0 2048.0 2048.0  0.0   2032.2 16384.0  10205.7   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           25.1 2048.0 2048.0  0.0   2032.2 16384.0  11014.1   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           26.1 2048.0 2048.0  0.0   2032.2 16384.0  12226.8   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           27.1 2048.0 2048.0  0.0   2032.2 16384.0  13035.3   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           28.1 2048.0 2048.0  0.0   2032.2 16384.0  13843.7   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           29.1 2048.0 2048.0  0.0   2032.2 16384.0  14652.2   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           30.1 2048.0 2048.0  0.0   2032.2 16384.0  15864.9   40960.0    11116.1   4864.0 3733.9 512.0  410.2       1    0.003   0      0.000    0.003
           31.1 2048.0 2048.0  0.0    0.0   16384.0   100.0    40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           32.1 2048.0 2048.0  0.0    0.0   16384.0   1012.4   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           33.1 2048.0 2048.0  0.0    0.0   16384.0   2012.6   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           34.1 2048.0 2048.0  0.0    0.0   16384.0   2912.7   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           35.2 2048.0 2048.0  0.0    0.0   16384.0   3812.8   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           36.2 2048.0 2048.0  0.0    0.0   16384.0   4813.0   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           37.2 2048.0 2048.0  0.0    0.0   16384.0   5713.1   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           38.2 2048.0 2048.0  0.0    0.0   16384.0   6613.3   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           39.2 2048.0 2048.0  0.0    0.0   16384.0   7513.4   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           40.2 2048.0 2048.0  0.0    0.0   16384.0   8413.6   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           41.2 2048.0 2048.0  0.0    0.0   16384.0   9313.7   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           42.2 2048.0 2048.0  0.0    0.0   16384.0  10213.8   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           43.2 2048.0 2048.0  0.0    0.0   16384.0  11214.0   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           44.2 2048.0 2048.0  0.0    0.0   16384.0  12114.1   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           45.3 2048.0 2048.0  0.0    0.0   16384.0  13014.3   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           46.3 2048.0 2048.0  0.0    0.0   16384.0  13914.4   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           47.3 2048.0 2048.0  0.0    0.0   16384.0  14814.6   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017
           48.2 2048.0 2048.0  0.0    0.0   16384.0  15714.7   40960.0    29273.4   4864.0 3734.0 512.0  410.2       2    0.007   1      0.010    0.017

C:\Users\86136>

那么通过上面的信息我们能够发现什么呢?

EU :年轻代中Eden(伊甸园)已使用的容量 (字节)可以发现已经满了16M

OU :Old代目前已使用空间 (字节),可以发现上面已经使用完了40M,所以程序应该会发生内存溢出

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值