天天看点

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

JVM监控及诊断工具-命令行篇

一、概述

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

简单命令行工具:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

以上

.jar

的程序源码在

tools.jar

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

二、jps:查看正在运行的Java进程

ps -ef|grep java
           

1、基本情况

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、测试

根据基本语法进行测试即可

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

3、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

可以通过

jps -help

来查看对应的参数信息

①options参数

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

综合使用:

jps -l -m等价于jps -lm
           

如何将信息输出到同级文件中:

语法:命令 > 文件名称
例如:jps -l > a.txt
           

②hostid参数

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

三、jstat:查看JVM统计信息

1、基本情况

通过命令行的方式,纯文本的方式去监视

整个内存JVM的占用

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

①option参数

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • 打印编译所花费的时间次数等信息:↓
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • 打印被jit编译器编译过的方法:↓
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

1、-class举例:

简单使用:↓

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

h3 中的3代表每隔3个分隔一次,

13344 代表类的进程id,

1000 代表每隔1000毫秒打印一次,

10 代表一共打印10次,

如下所示:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

Timestamp代表:程序至今的运行时间,单位为秒;

Loaded代表:加载的类的数目;

Bytes代表:加载的类的总字节数;

Unloaded代表:卸载的类的数目;

Bytes代表:卸载的类的总字节数;

Time代表:类装载所消耗的时间;

2、-gc举例:

13344代表类的进程id,执行结果如下所示:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

S0C:代表幸存者0区的总容量,

S1C:代表幸存者1区的总容量,

S0U:代表幸存者0区使用的容量,

S1U:代表幸存者1区使用的容量,

EC:代表伊甸园区的总容量,

EU:代表伊甸园区使用的总容量,

OC:代表老年代的总容量,

OU:代表老年代已经使用的容量,

MC:代表方法区的总容量,

MU:代表方法区的总容量,

CCSC:代表压缩类的总容量,

CCSU:代表压缩类使用的容量,

YGC:代表年轻代垃圾回收的次数,

YGCT:年轻代进行垃圾回收需要的时间,

FGC:代表代表Full GC的次数,

FGCT:代表Full GC的时间,

GCT:代表垃圾回收的总时间

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

3、-gccapacity举例:

13344代表类的进程id,执行结果如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

其中S0C代表幸存者0区的容量,S1C代表幸存者1区的容量,EC代表伊甸园区的容量,CCSC代表压缩类的容量,YGC代表年轻代垃圾回收的时间,FGC代表Full GC垃圾回收的时间

4、-gcutil举例:

查看堆内存空间占比情况

13152代表类的进程id,执行结果如下所示:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

以上是

各区域占比以及垃圾回收的情况

,S0代表幸存者0区,S1代表幸存者1区,E代表伊甸园区,O代表老年代,M代表方法区,CCS代表压缩类,以上这些值都是占比情况,YGC代表年轻代垃圾回收的次数,YGCT年轻代进行垃圾回收需要的时间,FGC代表代表Full GC的次数,FGCT代表Full GC的时间,GCT代表垃圾回收的总时间

5、-gccause举例:

发生GC的原因

13344代表类的进程id,执行结果如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

以上是

各区域占比以及垃圾回收的情况,还有触发垃圾回收的原因解释

,S0代表幸存者0区,S1代表幸存者1区,E代表伊甸园区,O代表老年代,M代表方法区,CCS代表压缩类,以上这些值都是占比情况,YGC代表年轻代垃圾回收的次数,YGCT年轻代进行垃圾回收需要的时间,FGC代表代表Full GC的次数,FGCT代表Full GC的时间,GCT代表垃圾回收的总时间,LGCC和GCC代表垃圾回收的原因

②interval参数

用于指定输出统计数据的周期,单位为毫秒。即:

查询间隔

,每个多少时间查询一次

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

③count参数

用于

指定查询的总次数

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

④-t参数

可以在输出信息前加上一个Timestamp列,显示程序的运行时间。单位:秒

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

经验:↓

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

执行jstat -gc -t 13152 1000 10,这代表1秒打印出1行,一共10行,-t代表打印出Timestamp总运行时间,结果如下所示:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

上方红色框框中代表Timestamp,而蓝色框框中代表垃圾回收时间,单位都是秒,如果让红色框框中的某两个值相减,假设这个值是num1,然后让对应行的蓝色框框中的另外两个值相减,假设这个值是num2,之后让num2/num1,得出的差值就是上述所说的GC时间占运行时间的比例

虽然这种方式比较繁琐,但是在项目部署之后就需要使用命令行去看了,就没有可视化界面了,所以这种方式也要会

左侧的是通过

-t

,知道程序执行的时间,两段可以相减算出这段时间内右侧GC时间相减获得这段时间的GC时间,右侧除以左侧,就可以算出垃圾回收时间占这段程序执行时间的比例,如果

比例超过20%

,就表明堆的压力比较大了

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

⑤-h参数

可以在周期性数据输出时,输出多少行数据后输出一个表头信息

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

3、补充

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

第1步可以执行命令:

jstat -gc -t 14024 1000 10

一段时间内抽取OU中的最小值,进行比较,如果发现不断上涨,就出现内存泄露

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

四、jinfo:实时查看和修改JVM配置参数

主要用来获取某一个参数的值,修改比较少

1、基本情况

Bean对象get/set()

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

①查看

  • jinfo -sysprops 进程id

可以查看由System.getProperties()取得的参数

进程id可以通过jps命令查看,操作结果如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • jinfo -flags 进程id

查看当前进程曾经赋过值的一些参数情况

进程id可以通过jps命令查看,参数赋值的一部分是我们自己设置的,另外一部分是系统自动优化设置的参数信息,具体操作如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • jinfo -flag 参数名称 进程id

查看某个java进程的具体参数的信息

进程id可以通过jps命令查看

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

②修改

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • 针对boolean类型
jinfo -flag [+|-]参数名称 进程id
           

PID可以通过jps命令查看,如果使用+号,那就可以让该参数起作用,否则使用-号就让该参数不起作用

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • 针对非boolean类型
jinfo -flag 参数名称=参数值 进程id
           

PID可以通过jps命令查看,如果使用+号,那就可以让该参数起作用,否则使用-号就让该参数不起作用

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

3、拓展

①java -XX:+PrintFlagsInitial

查看所有JVM参数启动的

初始值

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

②java -XX:+PrintFlagsFinal

查看所有JVM参数的

最终值

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

③java -参数名称:+PrintCommandLineFlags

查看那些已经被用户或者JVM设置过的详细的XX参数的名称和值

五、jmap:导出内存映像文件&内存使用情况

关注更多

堆空间

的情况

1、基本情况

jvm

内存映射

将某个阶段的内存情况映射成一个快照文件

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

生成的dump文件是不能通过记事本直接打开的,因为他是二进制文件

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

1、使用语法可以通过在DOS窗口中使用jmap/jmap -h/jmap -help查看

2、代表可执行的代码,比如使用> 文件名称来指定生成的dump文件的生成位置

3、[server_id@]是为远程连接准备的

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

3、使用1:导出内存映像文件

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

注意:

  1. 对于以上说明中的第1点是自动方式才会这样做,而手动不会在Full GC之后生成Dump
  2. 使用手动方式生成dump文件,一般指令执行之后就会生成,不用等到快出现OOM的时候
  3. 使用自动方式生成dump文件,当出现OOM之前先生成dump文件
  4. 如果使用手动方式,一般使用第2种,毕竟生成堆中存活对象的dump文件是比较小的,便于传输和分析

①手动的方式

说明:

  1. 中的

    filename是文件名称

    ,而

    .hprof是后缀名

    ,代表该值可以省略,当然后面的是进程id,需要通过jps查询出来
  2. format=b表示生成的是标准的dump文件

    ,用来进行格式限定

生成堆中所有对象的快照:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

生成堆中存活对象的快照:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

其中

file

=后面的是生成的dump文件地址,最后的11696是进程id,可以通过jps查看

一般使用的是第二种方式,也就是生成堆中存活对象的快照

,毕竟这种方式生成的dump文件更小,我们传输处理都更方便

jmap -dump:format=b,file=<filename.hprof> < pid > #生成堆中所有对象的快照
jmap -dump:live,format=b,file=<filename.hprof> < pid > #生成堆中存活对象的快照
           
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

②自动的方式

在快要发生OOM之前,自动生成dump文件

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

具体使用如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>

#比如
-Xmx100m -XX:+HeapDumpOnOutOfMemoryError -XX:heapDumpPath=D:\m.hprof
           

4、使用2:显示堆内存相关信息

获取展示运行指令的

这一刻

的堆内存情况,且返回的数据必然是在

安全点上

①jmap -heap 进程id

jmap -heap 进程id只是时间点上的堆信息,而jstat后面可以添加参数,可以指定时间动态观察数据改变情况,而图形化界面工具,例如jvisualvm等,它们可以用图表的方式动态展示出相关信息,更加直观明了

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

②jmap -histo 进程id

输出堆中对象的同级信息,包括类、实例数量和合计容量,也是这一时刻的内存中的对象信息

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

5、使用3:其他作用

这两个指令仅linux/solaris平台有效,所以无法在windows操作平台上演示,并且使用比较小众,不在多说

  • jmap -permstat 进程id

查看系统的ClassLoader信息

  • jmap -finalizerinfo

查看堆积在finalizer队列中的对象

6、小结

因为他jmap所获取到的数据是借助安全点的,因此会出现数据结果的偏差情况

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

六、jhat:JDK自带堆分析工具

去分析用jmap导出的dump文件

jhat命令在jdk9及其之后就

被移除

了,官方建议使用jvisualvm代替jhat,所以该指令只需简单了解一下即可

1、基本情况

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

其中dumpfile代表dump文件的地址以及名称,例如:

  • options参数
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

举例如下:

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

提供了端口为7000的一个界面:↓

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

七、jstack:打印JVM中线程快照

打印单独jvm进程中的所有

线程

的状态快照

1、基本情况

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

总结:

如果程序出现等待问题,可以使用该指令去查看问题所在,结果中也会提示你问题所在

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

八、jcmd:多功能命令行

一个顶多个,真的很强,终极缝合怪

1、基本情况

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

2、基本语法

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇
  • jcmd 进程号 具体命令

首先通过jcmd 进程号 help得出以下命令列表:

根据以上命令来替换之前的那些操作:

  1. Thread.print 可以替换 jstack指令
  2. GC.class_histogram 可以替换 jmap中的-histo操作
  3. GC.heap_dump 可以替换 jmap中的-dump操作
  4. GC.run 可以查看GC的执行情况
  5. VM.uptime 可以查看程序的总执行时间,可以替换jstat指令中的-t操作
  6. VM.system_properties 可以替换 jinfo -sysprops 进程id
  7. VM.flags 可以获取JVM的配置参数信息
  8. 等…
Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇

九、jstatd:远程主机信息收集

Day356.JVM监控及诊断工具-命令行 -JVMJVM监控及诊断工具-命令行篇