通过Java/JMX得到full GC次数?

本文介绍了如何通过Java的ManagementFactory获取垃圾收集器MXBean来统计Full GC的次数。示例代码展示了使用Groovy进行演示,区分了年轻代和老年代GC的计数方法。
摘要由CSDN通过智能技术生成
今天有个同事问如何能通过 JMX获取到某个Java进程的full GC次数:
引用
hi,问个问题,怎们在java中获取到full gc的次数呢?
我现在用jmx的那个得到了gc次数,不过不能细化出来full gc的次数

Java代码 复制代码
  1. for (final GarbageCollectorMXBean garbageCollector   
  2.         : ManagementFactory.getGarbageCollectorMXBeans()) {   
  3.     gcCounts += garbageCollector.getCollectionCount();   
  4. }  
for (final GarbageCollectorMXBean garbageCollector
        : ManagementFactory.getGarbageCollectorMXBeans()) {
    gcCounts += garbageCollector.getCollectionCount();
}

你比如我现在是这样拿次数的

我回答说因为full GC概念只有在分代式GC的上下文中才存在,而JVM并不强制要求GC使用分代式实现,所以JMX提供的标准 MXBean API里不提供“full GC次数”这样的方法也正常。
既然“full GC”本来就是非常平台相关的概念,那就hack一点,用平台相关的代码来解决问题好了。这些GC的MXBean都是有名字的,而主流的JVM的GC名字相对稳定,非要通过JMX得到full GC次数的话,用名字来判断一下就好了。

举个例子来看看。通过JDK 6自带的 JConsole工具来查看相关的MXBean的话,可以看到,

GC的MXBean在这个位置:


这个例子是用server模式启动JConsole的,使用的是ParallelScavenge GC,它的年老代对应的收集器在这里:


该收集器的总收集次数在此,这也就是full GC的次数:


于是只要知道我们用的JVM提供的GC MXBean的名字与分代的关系,就可以知道full GC的次数了。
Java代码写起来冗长,这帖就不用Java来写例子了,反正API是一样的,意思能表达清楚就OK。
用一个 Groovy脚本简单演示一下适用于Oracle (Sun) HotSpot与Oracle (BEA) JRockit的GC统计程序:
Groovy代码 复制代码
  1. import java.lang.management.ManagementFactory   
  2.   
  3. printGCStats = {   
  4.   def youngGenCollectorNames = [   
  5.     // Oracle (Sun) HotSpot   
  6.     // -XX:+UseSerialGC   
  7.     'Copy',   
  8.     // -XX:+UseParNewGC   
  9.     'ParNew',   
  10.     // -XX:+UseParallelGC   
  11.     'PS Scavenge',   
  12.        
  13.     // Oracle (BEA) JRockit   
  14.     // -XgcPrio:pausetime   
  15.     'Garbage collection optimized for short pausetimes Young Collector'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值