diff -r 000000000000 -r f90c822e73f8 test/gc/7072527/TestFullGCCount.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/gc/7072527/TestFullGCCount.java Wed Apr 27 01:25:04 2016 +0800 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test TestFullGCount.java + * @bug 7072527 + * @summary CMS: JMM GC counters overcount in some cases + * @run main/othervm -XX:+PrintGC TestFullGCCount + */ +import java.util.*; +import java.lang.management.*; + +/* + * Originally for a specific failure in CMS, this test now monitors all + * collectors for double-counting of collections. + */ +public class TestFullGCCount { + + static List collectors = ManagementFactory.getGarbageCollectorMXBeans(); + + public static void main(String[] args) { + int iterations = 20; + boolean failed = false; + String errorMessage = ""; + HashMap counts = new HashMap(); + + // Prime the collection of count lists for all collectors. + for (int i = 0; i < collectors.size(); i++) { + GarbageCollectorMXBean collector = collectors.get(i); + counts.put(collector.getName(), new ArrayList(iterations)); + } + + // Perform some gc, record collector counts. + for (int i = 0; i < iterations; i++) { + System.gc(); + addCollectionCount(counts, i); + } + + // Check the increments: + // Old gen collectors should increase by one, + // New collectors may or may not increase. + // Any increase >=2 is unexpected. + for (String collector : counts.keySet()) { + System.out.println("Checking: " + collector); + + for (int i = 0; i < iterations - 1; i++) { + List theseCounts = counts.get(collector); + long a = theseCounts.get(i); + long b = theseCounts.get(i + 1); + if (b - a >= 2) { + failed = true; + errorMessage += "Collector '" + collector + "' has increment " + (b - a) + + " at iteration " + i + "\n"; + } + } + } + if (failed) { + System.err.println(errorMessage); + throw new RuntimeException("FAILED: System.gc collections miscounted."); + } + System.out.println("Passed."); + } + + private static void addCollectionCount(HashMap counts, int iteration) { + for (int i = 0; i < collectors.size(); i++) { + GarbageCollectorMXBean collector = collectors.get(i); + List thisList = counts.get(collector.getName()); + thisList.add(collector.getCollectionCount()); + } + } +}