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

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day356.JVM监控及诊断工具-命令行 -JVM相关的知识,希望对你有一定的参考价值。

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

一、概述


简单命令行工具

以上.jar的程序源码在tools.jar


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

ps -ef|grep java

1、基本情况


2、测试

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


3、基本语法

可以通过jps -help来查看对应的参数信息


①options参数

综合使用

jps -l -m等价于jps -lm

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

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

②hostid参数


三、jstat:查看JVM统计信息

1、基本情况

通过命令行的方式,纯文本的方式去监视整个内存JVM的占用


2、基本语法

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


①option参数

  • 打印编译所花费的时间次数等信息:↓

  • 打印被jit编译器编译过的方法:↓


1、-class举例

简单使用:↓

jstat -class -t -h3 13344 1000 10

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

13344 代表类的进程id,

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

10 代表一共打印10次,

如下所示

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

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

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

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

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

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


2、-gc举例

jstat -gc 13344

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

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:代表垃圾回收的总时间


3、-gccapacity举例

jstat -gccapacity 13344

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

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


4、-gcutil举例

查看堆内存空间占比情况

jstat -gcutil 13344

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

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


5、-gccause举例

发生GC的原因

jstat -gccause 13344

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

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


②interval参数

用于指定输出统计数据的周期,单位为毫秒。即:查询间隔,每个多少时间查询一次


③count参数

用于指定查询的总次数


④-t参数

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

经验:↓

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

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

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


左侧的是通过-t,知道程序执行的时间,两段可以相减算出这段时间内右侧GC时间相减获得这段时间的GC时间,右侧除以左侧,就可以算出垃圾回收时间占这段程序执行时间的比例,如果比例超过20%,就表明堆的压力比较大了


⑤-h参数

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


3、补充

第1步可以执行命令:jstat -gc -t 14024 1000 10

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


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

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

1、基本情况

Bean对象get/set()


2、基本语法


①查看

  • jinfo -sysprops 进程id

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

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


  • jinfo -flags 进程id

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

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


  • jinfo -flag 参数名称 进程id

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

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


②修改


  • 针对boolean类型
jinfo -flag [+|-]参数名称 进程id

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


  • 针对非boolean类型
jinfo -flag 参数名称=参数值 进程id

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


3、拓展

①java -XX:+PrintFlagsInitial

查看所有JVM参数启动的初始值


②java -XX:+PrintFlagsFinal

查看所有JVM参数的最终值


③java -参数名称:+PrintCommandLineFlags

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


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

关注更多堆空间的情况

1、基本情况

jvm内存映射

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

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


2、基本语法

1、使用语法可以通过在DOS窗口中使用jmap/jmap -h/jmap -help查看
2、代表可执行的代码,比如使用> 文件名称来指定生成的dump文件的生成位置
3、[server_id@]是为远程连接准备的


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

注意

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

①手动的方式

说明

  1. 中的filename是文件名称,而.hprof是后缀名,代表该值可以省略,当然后面的是进程id,需要通过jps查询出来
  2. format=b表示生成的是标准的dump文件,用来进行格式限定

生成堆中所有对象的快照

生成堆中存活对象的快照

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

一般使用的是第二种方式,也就是生成堆中存活对象的快照,毕竟这种方式生成的dump文件更小,我们传输处理都更方便


jmap -dump:format=b,file=<filename.hprof> < pid > #生成堆中所有对象的快照
jmap -dump:live,format=b,file=<filename.hprof> < pid > #生成堆中存活对象的快照


②自动的方式

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

具体使用如下

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=<filename.hprof>

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

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

获取展示运行指令的这一刻的堆内存情况,且返回的数据必然是在安全点上

①jmap -heap 进程id

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

②jmap -histo 进程id

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


5、使用3:其他作用

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

  • jmap -permstat 进程id

查看系统的ClassLoader信息

  • jmap -finalizerinfo

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


6、小结

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


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

去分析用jmap导出的dump文件

jhat命令在jdk9及其之后就被移除了,官方建议使用jvisualvm代替jhat,所以该指令只需简单了解一下即可

1、基本情况


2、基本语法

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

  • options参数

举例如下

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


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

打印单独jvm进程中的所有线程的状态快照

1、基本情况


2、基本语法


总结

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



八、jcmd:多功能命令行

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

1、基本情况


2、基本语法


  • 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. 等…


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

以上是关于Day356.JVM监控及诊断工具-命令行 -JVM的主要内容,如果未能解决你的问题,请参考以下文章

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

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

JVM监控诊断之命令行使用

JVM监控诊断之命令行使用

JVM监控诊断之命令行使用

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