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

248 阅读5分钟

“这是我参与更文挑战的第2天,活动详情查看: 更文挑战

上篇介绍的JVM性能监控与调优篇-概述篇,简单的介绍了下大概内容,有点像梳理知识,没错,接下来给大家介绍下JVM监控及诊断工具之命令行上篇。

一、概述

  1. 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。
  2. Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。
  3. 大家慢慢体会,是不是这么个道理:①使用数据说明问题,使用知识分析问题,使用工具处理问题。②无监控、不调优!哈哈哈,别动不动就提调优,没监控咋调优!!!
  4. 在我们刚接触Java学习的时候,大家肯定最先了解的两个命令就是javac、java,那么除此之外,还有没有其他的命令可以供我们使用呢?我们进入到安装jdk的bin目录,发现还有一系列辅助工具。这些辅助工具用来获取目标JVM不同方面、不同层次的信息,帮助开发人员很好地解决Java应用程序的一些疑难杂症。详细参考链接。

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

大家经常用的就是jps,可以带一些选项参数,比较常用的如下:


-q:仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类的名称等

-l:输出应用程序主类的全类名或如果进程执行的是jar包,则输出jar完整路径

-m:输出虚拟机进程启动时传递给主类main()的参数

三、jstat(查看JVM统计信息)

1.查看命令相关参数

jstat -h 或 jstat -help

2.选项option可以由以下值构成

2.1 类装载相关的

-class:显示ClassLoader的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间等

2.2 垃圾回收相关的

-gc:显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。

-gccapacity:显示内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。

-gcutil:显示内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。

-gccause:与-gcutil功能一样,但是会额外输出导致最后一次或当前正在发生的GC产生的原因。

-gcnew:显示新生代GC状况

-gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间

-geold:显示老年代GC状况

-gcoldcapacity:显示内容与-gcold基本相同,输出主要关注使用到的最大、最小空间

-gcpermcapacity:显示永久代使用到的最大、最小空间。

2.3 JIT相关的

-compiler:显示JIT编译器编译过的方法、耗时等信息

-printcompilation:输出已经被JIT编译的方法

3. 重点介绍-gc选项

image.png

3.1 新生代相关

  • S0C是第一个幸存者区的大小(字节)
  • S1C是第二个幸存者区的大小(字节)
  • S0U是第一个幸存者区已使用的大小(字节)
  • S1U是第二个幸存者区已使用的大小(字节)
  • EC是Eden空间的大小(字节)
  • EU是Eden空间已使用的大小(字节)

3.2 老年代相关

  • OC是老年代的大小(字节)
  • OU是老年代已使用的大小(字节)

3.3 方法区(元空间)相关,针对jdk8及以后

  • MC是方法区的大小
  • MU是方法区已使用的大小
  • CCSC是压缩类空间的大小
  • CCSU是压缩类空间已使用的大小

3.4 其它

  • YGC是指从应用程序启动到采样时young gc次数
  • YGCT是指从应用程序启动到采样时young gc消耗的时间(秒)
  • FGC是指从应用程序启动到采样时full gc次数
  • FGCT是指从应用程序启动到采样时full gc消耗的时间(秒)
  • GCT是指从应用程序启动到采样时gc的总时间

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

1. 基本介绍

jinfo(Configuration Info for Java) 查看虚拟机配置参数信息,也可用于调整虚拟机的配置参数。

在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。

2. 查看

2.1 jinfo -sysprops PID

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

2.2 jinfo -flags PID

查看曾经赋过值得一些参数,比较用的多些。

2.3 jinfo -flag 具体参数 PID

查看某个Java进程的具体参数的值

image.png

3. 修改

3.1 针对boolean类型

jinfo -flag [+|-]具体参数 PID

3.2 针对非boolean类型

jinfo -flag 具体参数=具体参数值 PID

4. 扩展

4.1 java -XX:+PrintFlagsInitial

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

4.2 java -XX:+PrintFlagsFinal

查看所有JVM参数的最终值

4.3 java -XX:+PrintCommandLineFlags

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

5. 总结

JVM自带的命令行工具挺丰富的,当然介绍起来也挺多的,这里先总结了JVM监控及诊断工具-命令行上篇,下篇介绍JVM监控及诊断工具-命令行下篇,jmap、jhat、jstack、jcmd的使用。

欢迎大家关注公众号(MarkZoe)互相学习、互相交流。