当前位置:   article > 正文

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

idea 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、首先我们创建一个测试程序,如下:

  1. package com.kgf.kgfjavalearning2021.jvm;
  2. import java.util.ArrayList;
  3. /***
  4. * 测试GC的频率:
  5. * 设置内存大小:-Xmx60m -XX:SurvivorRatio=8
  6. *
  7. * -Xmx60m: 表示是最大堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你
  8. * -XX:SurvivorRatio=8:
  9. * 设置新生代中eden和S0/S1空间的比例
  10. * 默认
  11. * -XX:SurvivorRatio=8,Eden:S0:S1=8:1:1
  12. * 假如
  13. * -XX:SurvivorRatio=4,Eden:S0:S1=4:1:1
  14. * SurvivorRatio值就是设置Eden区的比例占多少,S0/S1相同
  15. *
  16. */
  17. public class GCTest {
  18. public static void main(String[] args) {
  19. ArrayList<byte[]> list = new ArrayList<>();
  20. for (int i = 0; i < 1000; i++) {
  21. byte[] arr = new byte[1024*100];//每次向list中存放100kb的字节数组
  22. list.add(arr);
  23. try {
  24. Thread.sleep(100);
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. }

设置堆内存内存最大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次,并且前面加上日期

  1. C:\Users\86136>jps
  2. 13524 Jps
  3. 5252
  4. 12664 KotlinCompileDaemon
  5. 2504 GCTest
  6. 4904 Launcher
  7. 7100 RemoteMavenServer
  8. C:\Users\86136>jstat -gc -t 2504 1000 30
  9. Timestamp S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. 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
  39. 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
  40. C:\Users\86136>

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/653684
推荐阅读
相关标签
  

闽ICP备14008679号