Jvm minor Gc 和 major Gc 计数统计

Jvm 中的 GC类型

Jvm中GC类型可以分为 Minor collection 和 Major collection,所谓经常提到的 full gc 并没有强制要求实现。

不同类型的GC执行时机和作用

  • Minor collection: 当young space被占满时执行。它比major collections快,因为minor collection检查的是major collection检查的子集。minor collection也比major collection发生的频率高。
  • Major collection:当tenured space被占满时执行。他会清理tenured和young。

不同类型的GC计数统计

Jvm自身并没有分别提供 Minor Gc 和 Major Gc的计数统计API,但是通过特定的GC名称可以判断出GC的类型类来分别进行统计。

Jvm 获取GC次数的方式

1
ManagementFactory.getGarbageCollectorMXBeans()

以上返回的为一个集合类,Jvm中可能会有多个GarbageCollectorMXBean,调用以下GarbageCollectorMXBean的方法就可以获取 Gc的次数和Gc的时间。

1
2
public long getCollectionCount();
public long getCollectionTime();

获取Minor Gc Bean

以下集合为Jvm 中 Minor Gc Bean 的名称

1
2
3
4
5
6
7
8
9
private static final Set<String> minorCollectionBeans =new HashSet<String>();
static{
minorCollectionBeans.add("ParNew");
minorCollectionBeans.add("G1 Young Generation");
minorCollectionBeans.add("Garbage collection optimized for throughput Young Collector");
minorCollectionBeans.add("Garbage collection optimized for short pausetimes Young Collector");
minorCollectionBeans.add("Copy");
minorCollectionBeans.add("PS Scavenge");
}

遍历Jvm中所有的GarbageCollectorMXBean,获取minor类型的GarbageCollectorMXBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private GarbageCollectorMXBean getMinorCollectionMXBean()
{
try
{
for(GarbageCollectorMXBean garbageCollectorMXBean: ManagementFactory.getGarbageCollectorMXBeans()){
for(String beanName: minorCollectionBeans){
if (garbageCollectorMXBean.getName().equals(beanName))
{
return garbageCollectorMXBean;
}
}
}
}
catch (Throwable throwable)
{}
return null;
}

获取Major Gc Bean

以下集合为Jvm 中 Major Gc Bean 的名称

1
2
3
4
5
6
7
8
9
10
private static final Set<String> majorCollectionBeans = new HashSet<String>();
static{
majorCollectionBeans.add("J9 GC");
majorCollectionBeans.add("G1 Old Generation");
majorCollectionBeans.add("Garbage collection optimized for short pausetimes Old Collector");
majorCollectionBeans.add("PS MarkSweep");
majorCollectionBeans.add("ConcurrentMarkSweep");
majorCollectionBeans.add("Garbage collection optimized for throughput Old Collector");
majorCollectionBeans.add("MarkSweepCompact");
}

遍历Jvm中所有的GarbageCollectorMXBean,获取Major类型的GarbageCollectorMXBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private GarbageCollectorMXBean getMajorCollectionMXBean()
{
try
{
for( GarbageCollectorMXBean garbageCollectorMXBean : ManagementFactory.getGarbageCollectorMXBeans()){
for(String beanName: majorCollectionBeans){
if (garbageCollectorMXBean.getName().equals(beanName)){
return garbageCollectorMXBean;
}
}
}
}
catch (Throwable throwable)
{}
return null;
}

获取到不同类型的GC Bean 使用其获取次数的API就可以分别计数了。