test/gc/7072527/TestFullGCCount.java
Print this page
rev 4494 : 7109087: gc/7072527/TestFullGCCount.java fails when GC is set in command-line
Reviewed-by: mgerdin
*** 1,7 ****
/*
! * Copyright (c) 2011, 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.
--- 1,7 ----
/*
! * 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.
*** 23,95 ****
/*
* @test TestFullGCount.java
* @bug 7072527
* @summary CMS: JMM GC counters overcount in some cases
! * @run main/othervm -XX:+UseConcMarkSweepGC TestFullGCCount
! *
*/
import java.util.*;
import java.lang.management.*;
public class TestFullGCCount {
! public String collectorName = "ConcurrentMarkSweep";
! public static void main(String [] args) {
! TestFullGCCount t = null;
! if (args.length==2) {
! t = new TestFullGCCount(args[0], args[1]);
! } else {
! t = new TestFullGCCount();
}
- System.out.println("Monitoring collector: " + t.collectorName);
- t.run();
- }
! public TestFullGCCount(String pool, String collector) {
! collectorName = collector;
}
! public TestFullGCCount() {
! }
! public void run() {
! int count = 0;
! int iterations = 20;
! long counts[] = new long[iterations];
! boolean diffAlways2 = true; // assume we will fail
!
! for (int i=0; i<iterations; i++) {
! System.gc();
! counts[i] = getCollectionCount();
! if (i>0) {
! if (counts[i] - counts[i-1] != 2) {
! diffAlways2 = false;
}
}
}
! if (diffAlways2) {
! throw new RuntimeException("FAILED: System.gc must be incrementing count twice.");
}
System.out.println("Passed.");
}
! private long getCollectionCount() {
! long count = 0;
! List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
! List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
! for (int i=0; i<collectors.size(); i++) {
GarbageCollectorMXBean collector = collectors.get(i);
! String name = collector.getName();
! if (name.contains(collectorName)) {
! System.out.println(name + ": collection count = "
! + collector.getCollectionCount());
! count = collector.getCollectionCount();
}
}
- return count;
- }
-
}
-
--- 23,91 ----
/*
* @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<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
! public static void main(String[] args) {
! int iterations = 20;
! boolean failed = false;
! String errorMessage = "";
! HashMap<String, List> counts = new HashMap<String, List>();
! // 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<Long>(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<Long> 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<String, List> 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());
}
}
}