龙空技术网

详解如何用jstat快速监控JAVA程序内存溢出

波波说运维 266

前言:

此刻朋友们对“java监控程序是否挂了”大约比较重视,小伙伴们都需要分析一些“java监控程序是否挂了”的相关内容。那么小编也在网络上网罗了一些有关“java监控程序是否挂了””的相关资讯,希望你们能喜欢,兄弟们快快来了解一下吧!

概述

前面已经介绍了GC是如何工作的,什么是年轻代和老年代,GC的机制以及FULL GC等相关概念,对于系统运维,更重要的还是在怎么去监控GC和优化GC,接下来介绍下监控方面的内容。

什么是GC监控

GC监控指了解JVM是如何运行GC的过程,例如了解:

一个年轻代中的对象什么时候会被移动到老年代,这个过程会消耗多长时间或者说 什么时候会发生 stop-the-world ,持续时间有多久

GC监控就是为了弄清JVM是否在进行高效的垃圾收集,并检查是否有必要进行GC优化。基于以上信息,可以考虑修改应用程序的代码或者调整GC种类(GC优化)。

如何监控GC

监控GC的方式有多种,唯一的区别是展示GC信息的方式不同。GC操作由JVM完成,由于GC监控工具获取的GC信息都是由JVM提供,所以无论使用何种工具监控GC都将得到相同的结果。不过由于了解每种GC监控方式只需少量的时间,多知道几种还是有助于你在不同场景和环境中选择合适的GC监控方式。

首先,根据访问接口的不同,GC监控方式可以分为CUI(命令行交互接口) 和 GUI(图形界面接口) 两种。典型的CUI GC监控方法包含了一个叫做 jstat 的独立CUI程序,或者在运行JVM时使用 verbosegc 选项。

GUI GC监控是通过独立的GUI程序来完成,使用最广泛的三种程序分别为:jsonsole、jvisualvm和Visual GC。

篇幅有限,这里主要介绍jstat是怎么监控GC的。

jstat

1、相关概念

jstat: JVM Statistics Monitoring Tool;jstatd: jstat detail

jstat 是HotSpot JVM中的一个监控工具,HotSpot JVM中其他的监控工具有 jps 和 jstatd。有时需要结合使用这三种方式来监控Java应用。

jstat 不仅可以提供GC操作信息,也可以提供class loader的操作信息或JIT编译器的操作信息。在jstat可以提供的所有信息中,我们将仅介绍监控GC操作信息的功能。

jstat 位于$JDK_HOME/bin下,所以如果 java 或 javac 可以运行,那么 jstat也可以直接使用。

2、实例

jstat –gc $<vmid$> 1000

运行jstat -gc <vmid> 1000(or 1s)将会每隔1s在控制台上输出一次GC数据。jstat -gc <vmid> 1000 10将会每隔1s输出一次GC数据,总共输出10次。

思路:首先通过jps命令找到你要监控的Java应用的vmid,并把它作为jstat的参数。当几个WAS实例运行在同一台设备上时,如果你只使用jps命令,将只能看到启动(bootstrap)信息。建议在这种情况下使用 ps -ef | grep java与 jps 配合使用。

GC性能数据需要持续的监测,因此,当运行jstat时,需要以一定的频率输出GC监控信息。

例如,运行 “ jstat -gc 1000 “ (or 1s) 命令将在控制台每次刷新一次监控数据。

使用频率最高的按顺序可能是:-gcutil(或gccause)、-gc 和 -gccapacity。

-gcutil 用于检查堆区域内存使用情况,GC次数以及GC操作的总时间-gccapacity 和其他选项用于检查实际分配的内存大小

不同的jstat选项会展示不同的列,以下是列信息。

jstat 的好处是只要有控制台可以使用,就可以持续的监控本地或远程运行中Java应用的GC操作信息。当使用 -gcutil 时会输出以下结果,在进行GC优化时,要特别注意:YGC、YGCT、FGC、FGCT和GCT。

这些指标非常重要,它们展示了GC运行的时间。

在这个例子中,YGC一共217次,YGCT为0.928秒,通过计算算数平均值,可以知道每次Yong GC的平均时间为4ms,同样可以算出 Full GC的平均时间为33ms.

但是算数平均值对于分析实际的GC问题可能并没有太大作用,这是因为GC之间的时间差异很大(换句话说,如果Full GC平均时间为0.067s,其中有一次可能是将近1ms,而另一次可能是将近57ms)。为了了解每次GC的时间,而不是使用算术平均数来代替,最好使用 -verbosegc。

3、-verbosegc参数

-verbosegc 是在Java应用启动时指定的JVM选项。jstat 可以在不指定任何JVM参数的情况下使用,-verbosegc 需要在JVM启动时指定,因此这个选项可能认为没什么必要(因此可以使用jstat代替)。然而,当发生GC时 -verbosegc 展示的结果更加容易理解,对于监控GC操作也十分有用。

jstat-verbosegc监控对象本机Java应用可以将日志输出到终端,远程应用可以借助jstatd使用网络连接来进行监控仅在JVM启动时设置了-verbogc参数才有效输出信息堆状态信息(使用情况、最大size、GC次数、时间等)GC执行前后新生代和老年代的大小以及GC操作时间输出时间根据设定好的时间输出任何发生GC的时候都会输出什么时候有用尝试观察堆区空间变化时尝试监控单次GC时

以下选项可以和 -verbosegc 结合使用:

-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-XX:+PrintGCDateStamps (from JDK 6 update 4)

如果只使用了 -verbosegc,默认会加上 -XX:+PrintGCDetails 选项。其他选项也可以和 -verbosegc 结合使用。

下面是-verbosegc 输出minor GC的例子:

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

标签: #java监控程序是否挂了