--- old/test/gc/metaspace/TestMetaspacePerfCounters.java 2016-08-16 11:49:55.438080852 +0200 +++ new/test/gc/metaspace/TestMetaspacePerfCounters.java 2016-08-16 11:49:55.270080019 +0200 @@ -21,10 +21,12 @@ * questions. */ +import java.lang.management.GarbageCollectorMXBean; import java.util.List; import java.util.ArrayList; - import jdk.test.lib.*; +import sun.management.ManagementFactoryHelper; + import static jdk.test.lib.Asserts.*; /* @test TestMetaspacePerfCounters @@ -35,7 +37,7 @@ * space exists and works. * @modules java.base/jdk.internal.misc * java.compiler - * java.management + * java.management/sun.management * jdk.jvmstat/sun.jvmstat.monitor * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UseSerialGC TestMetaspacePerfCounters * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-UseCompressedOops -XX:-UseCompressedClassPointers -XX:+UsePerfData -XX:+UseParallelGC -XX:+UseParallelOldGC TestMetaspacePerfCounters @@ -48,6 +50,7 @@ public class TestMetaspacePerfCounters { public static Class fooClass = null; private static final String[] counterNames = {"minCapacity", "maxCapacity", "capacity", "used"}; + private static final List gcBeans = ManagementFactoryHelper.getGarbageCollectorMXBeans(); public static void main(String[] args) throws Exception { String metaspace = "sun.gc.metaspace"; @@ -65,10 +68,27 @@ } private static void checkPerfCounters(String ns) throws Exception { - long minCapacity = getMinCapacity(ns); - long maxCapacity = getMaxCapacity(ns); - long capacity = getCapacity(ns); - long used = getUsed(ns); + long gcCountBefore; + long gcCountAfter; + long minCapacity; + long maxCapacity; + long capacity; + long used; + + // The perf counter values are updated during GC and to be able to + // do the assertions below we need to ensure that the values are from + // the same GC cycle. + do { + gcCountBefore = currentGCCount(); + + minCapacity = getMinCapacity(ns); + maxCapacity = getMaxCapacity(ns); + capacity = getCapacity(ns); + used = getUsed(ns); + + gcCountAfter = currentGCCount(); + assertGTE(gcCountAfter, gcCountBefore); + } while(gcCountAfter > gcCountBefore); assertGTE(minCapacity, 0L); assertGTE(used, minCapacity); @@ -127,4 +147,12 @@ private static long getUsed(String ns) throws Exception { return PerfCounters.findByName(ns + ".used").longValue(); } + + private static long currentGCCount() { + long gcCount = 0; + for (GarbageCollectorMXBean bean : gcBeans) { + gcCount += bean.getCollectionCount(); + } + return gcCount; + } }