目前我们所接触到的Java类系统还是占了绝大部分的,所以针对于JAVA类系统的监控分析是我们需要掌握的。目前Java类系统分监控分析手段有开源工具类、商用产品类、自带命令,其中最常用的有jvisualvm、jconsole、glowroot、arthas、jprofiler等。其实这些工具不管是开源和商用的都是通过执行底层命令获取监控数据进行整理展示的,所以我们今天就来聊一聊命令监控分析,也就是Sun JDK自带的命令。
以下命令都是在java安装的bin目录下例如/usr/jdk1.8/bin
1、jcmd
他是一个多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析(jmc 工具的飞行记录器)
1)查看当前机器的JVM进程信息 jcmd -l
2)查看指定进程的性能信息 jcmd pid PerfCounter.print
3)列出当前JAVA进程可执行的操作 jcmd pid help
2、jps
是java提供的一个显示当前所有java进程pid的命令 jps
3、jstat
主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控
详细监控GC回收命令为jstat -gcutil pid 1s
详细解释如下:S0:第一个幸存区的使用大小
S1:第二个幸存区的使用大小
E:伊甸园区的使用大小
O:老年代使用大小
M:方法区使用大小
CCS:压缩类空间使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
4、jstack
jstack主要是用来查看某个java进程内的线程堆栈信息
1)详细查看java进程线程状态和消耗堆栈信息:jstack -l pid
2)针对线程信息的转储文件,我们可以直接打开查看也可以通过格式化工具进行查看,通过jca433.jar查看具体命令java -jar jca433.jar
5、jmap
jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)
通俗理解就是当我们的java程序出现OOM的时候通过jmap可以生成对应的内存heapdump文件,通过heapdump文件分析内存泄露的泄露源。
jmap -dump:live,format=b,file=dump.txt pid
6、jhat
主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。所以jhat主要是跟jmap组合使用,但让也可以离线分析heapdump文件。
1)jhat -J -Xmx4096m xxx.dmp (由于产生的heapdump文件较大,所以往往需要制定堆大小才能打开)
jhat是一个server/client模式的,server负责分析dump文件,client展示。主要如下:
http://ip:7000/
对于jhat启动后显示的html页面中功能:
(1)显示出堆中所包含的所有的类
(2)从根集能引用到的对象
(3)显示平台包括的所有类的实例数量
(4)堆实例的分布表
(5)执行对象查询语句
输入内容如:
#查询长度大于100的字符串
select s from java.lang.String s where s.count > 100
详细的OQL可点击上图的“OQL help”
2)对于heapdump的分析除了使用jhat之外,还可以使用IBM HeapAnalyzer
java -Xms1024m -Xmx4096m -jar ha456.jar
7、jinfo
可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
jinfo pid
8、jvisualvm
jdk自带的成型的监控分析工具,可以监控JVM运行时的JVM参数、系统参数、堆栈、线程、CPU使用等信息。可分析本地应用及远程应用
9、jconsole
JConsole 也是JDK自带的一款成型监控工具,基本包括以下基本功能:概述、内存、线程、类、VM概要、MBean等。
备注:
1、以上命令除了jvisualvm和jconsole工具外,其他命令都只在Sun Jdk下支持。
2、以上文章介绍的命令只列出了常用部分,其他扩展部分可以使用-help查看使用。