垃圾回收期(GC)异常告警
<h1>报警描述</h1>
<p>业务[XX业务],虚拟机[X.X.X.X],用途[XXXX],负责人[XXX]JVM|XX|GC状态异常,状态为垃圾回收时间超过1秒</p>
<h1>说明</h1>
<p>java会定时使用垃圾回收器(GC)对内存进行清理,通常回收时间都是毫秒级,超过1秒,说明GC工作效率低,系统可能卡顿。</p>
<h1>监控对象</h1>
<p>Java虚拟机。</p>
<h1>监控方式</h1>
<p>通过如下命令获取jvm性能信息</p>
<pre><code>jcmd 10292 PerfCounter.print</code></pre>
<p>输出</p>
<pre><code>java.ci.totalTime=126232327
java.cls.loadedClasses=6378
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=72
java.property.java.class.path="C:\TopsecAgent\yajsw\wrapperApp.jar;C:\TopsecAgent\tsm_lib\activemq-core-5.15.2.jar;C:\TopsecAgent\tsm_lib\cglib.jar;C:\TopsecAgent\tsm_lib\commons-codec-1.9.jar;C:\TopsecAgent\tsm_lib\commons-collections-3.2.2.jar;C:\TopsecAgent\tsm_lib\commons-io-2.0.1.jar;C:\TopsecAgent\tsm_lib\commons-lang-2.6.jar;C:\TopsecAgent\tsm_lib\commons-net-3.3.jar;C:\TopsecAgent\tsm_lib\commons-pool-1.5.4.jar;C:\TopsecAgent\tsm_lib\disruptor-3.3.2.jar;C:\TopsecAgent\tsm_lib\dom4j.jar;C:\TopsecAgent\tsm_lib\dubbo-2.5.3.jar;C:\TopsecAgent\tsm_lib\ehcache-2.8.2.jar;C:\TopsecAgent\tsm_lib\groovy-all-1.8.6.jar;C:\TopsecAgent\tsm_lib\guava-18.0.jar;C:\TopsecAgent\tsm_lib\hibernate3.jar;C:\TopsecAgent\tsm_lib\jboss-jsr77.jar;C:\TopsecAgent\tsm_lib\jcl-over-slf4j-1.7.13.jar;C:\TopsecAgent\tsm_lib\je-6.2.31.jar;C:\TopsecAgent\tsm_lib\jms.jar;C:\TopsecAgent\tsm_lib\jna-4.1.0.jar;C:\TopsecAgent\tsm_lib\jnetpcap.jar;C:\TopsecAgent\tsm_lib\jsch-0.1.54.jar;C:\TopsecAgent\tsm_lib\jug.jar;C:\TopsecAgent\tsm_lib\log4j.jar;C:\TopsecAgent\tsm_lib\l"
java.property.java.endorsed.dirs="C:\TopsecAgent\jdk\lib\endorsed"
java.property.java.ext.dirs="C:\TopsecAgent\jdk\lib\ext;C:\Windows\Sun\Java\lib\ext"
java.property.java.home="C:\TopsecAgent\jdk"
java.property.java.library.path="."
java.property.java.version="1.8.0_131"
java.property.java.vm.info="mixed mode"
java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM"
java.property.java.vm.specification.name="Java Virtual Machine Specification"
java.property.java.vm.specification.vendor="Oracle Corporation"
java.property.java.vm.specification.version="1.8"
java.property.java.vm.vendor="Oracle Corporation"
java.property.java.vm.version="25.131-b11"
...</code></pre>
<p>获取其中如下信息:</p>
<pre><code>#新生代累计回收次数
sun.gc.collector.0.invocations=4865
#新生代累计回收时间
sun.gc.collector.0.time=126185779
#老年代累计回收次数
sun.gc.collector.1.invocations=226
#老年代累计回收时间
sun.gc.collector.1.time=10836180</code></pre>
<p>进行计算:</p>
<pre><code>delta_新生代回收时间 = 本次监控_新生代累计回收时间 - 上次监控_新生代累计回收时间
delta_新生代回收次数 = 本次监控_新生代累计回收次数 - 上次监控_新生代累计回收次数
新生代垃圾回收时间 = delta_新生代回收时间 / delta_新生代回收次数
delta_老年代回收时间 = 本次监控_老年代累计回收时间 - 上次监控_老年代累计回收时间
delta_老年代回收次数 = 本次监控_老年代累计回收次数 - 上次监控_老年代累计回收次数
老年代垃圾回收时间 = delta_老年代回收时间 / delta_老年代回收次数</code></pre>
<p>如果“新生代垃圾回收时间”或“老年代垃圾回收时间”超过1秒,则触发“异常”级别告警。</p>
<h1>规则</h1>
<p>默认为异常级别。</p>
<h1>告警举例</h1>
<p>业务[HRP平台],虚拟机[192.100.129.1],用途[接口应用]JVM|8888|GC状态提醒,状态为垃圾回收时间超过1秒。</p>