Print this page
rev 4494 : 7109087: gc/7072527/TestFullGCCount.java fails when GC is set in command-line
Reviewed-by: mgerdin
Split |
Split |
Close |
Expand all |
Collapse all |
--- old/test/gc/7072527/TestFullGCCount.java
+++ new/test/gc/7072527/TestFullGCCount.java
1 1 /*
2 - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
2 + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 4 *
5 5 * This code is free software; you can redistribute it and/or modify it
6 6 * under the terms of the GNU General Public License version 2 only, as
7 7 * published by the Free Software Foundation.
8 8 *
9 9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 12 * version 2 for more details (a copy is included in the LICENSE file that
13 13 * accompanied this code).
14 14 *
15 15 * You should have received a copy of the GNU General Public License version
16 16 * 2 along with this work; if not, write to the Free Software Foundation,
17 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
↓ open down ↓ |
5 lines elided |
↑ open up ↑ |
18 18 *
19 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 20 * or visit www.oracle.com if you need additional information or have any
21 21 * questions.
22 22 */
23 23
24 24 /*
25 25 * @test TestFullGCount.java
26 26 * @bug 7072527
27 27 * @summary CMS: JMM GC counters overcount in some cases
28 - * @run main/othervm -XX:+UseConcMarkSweepGC TestFullGCCount
29 - *
28 + * @run main/othervm -XX:+PrintGC TestFullGCCount
30 29 */
31 30 import java.util.*;
32 31 import java.lang.management.*;
33 32
33 +/*
34 + * Originally for a specific failure in CMS, this test now monitors all
35 + * collectors for double-counting of collections.
36 + */
34 37 public class TestFullGCCount {
35 38
36 - public String collectorName = "ConcurrentMarkSweep";
39 + static List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
37 40
38 - public static void main(String [] args) {
41 + public static void main(String[] args) {
42 + int iterations = 20;
43 + boolean failed = false;
44 + String errorMessage = "";
45 + HashMap<String, List> counts = new HashMap<String, List>();
39 46
40 - TestFullGCCount t = null;
41 - if (args.length==2) {
42 - t = new TestFullGCCount(args[0], args[1]);
43 - } else {
44 - t = new TestFullGCCount();
47 + // Prime the collection of count lists for all collectors.
48 + for (int i = 0; i < collectors.size(); i++) {
49 + GarbageCollectorMXBean collector = collectors.get(i);
50 + counts.put(collector.getName(), new ArrayList<Long>(iterations));
45 51 }
46 - System.out.println("Monitoring collector: " + t.collectorName);
47 - t.run();
48 - }
49 52
50 - public TestFullGCCount(String pool, String collector) {
51 - collectorName = collector;
52 - }
53 + // Perform some gc, record collector counts.
54 + for (int i = 0; i < iterations; i++) {
55 + System.gc();
56 + addCollectionCount(counts, i);
57 + }
53 58
54 - public TestFullGCCount() {
55 - }
59 + // Check the increments:
60 + // Old gen collectors should increase by one,
61 + // New collectors may or may not increase.
62 + // Any increase >=2 is unexpected.
63 + for (String collector : counts.keySet()) {
64 + System.out.println("Checking: " + collector);
56 65
57 - public void run() {
58 - int count = 0;
59 - int iterations = 20;
60 - long counts[] = new long[iterations];
61 - boolean diffAlways2 = true; // assume we will fail
62 -
63 - for (int i=0; i<iterations; i++) {
64 - System.gc();
65 - counts[i] = getCollectionCount();
66 - if (i>0) {
67 - if (counts[i] - counts[i-1] != 2) {
68 - diffAlways2 = false;
66 + for (int i = 0; i < iterations - 1; i++) {
67 + List<Long> theseCounts = counts.get(collector);
68 + long a = theseCounts.get(i);
69 + long b = theseCounts.get(i + 1);
70 + if (b - a >= 2) {
71 + failed = true;
72 + errorMessage += "Collector '" + collector + "' has increment " + (b - a) +
73 + " at iteration " + i + "\n";
69 74 }
70 75 }
71 76 }
72 - if (diffAlways2) {
73 - throw new RuntimeException("FAILED: System.gc must be incrementing count twice.");
77 + if (failed) {
78 + System.err.println(errorMessage);
79 + throw new RuntimeException("FAILED: System.gc collections miscounted.");
74 80 }
75 81 System.out.println("Passed.");
76 82 }
77 83
78 - private long getCollectionCount() {
79 - long count = 0;
80 - List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
81 - List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
82 - for (int i=0; i<collectors.size(); i++) {
84 + private static void addCollectionCount(HashMap<String, List> counts, int iteration) {
85 + for (int i = 0; i < collectors.size(); i++) {
83 86 GarbageCollectorMXBean collector = collectors.get(i);
84 - String name = collector.getName();
85 - if (name.contains(collectorName)) {
86 - System.out.println(name + ": collection count = "
87 - + collector.getCollectionCount());
88 - count = collector.getCollectionCount();
89 - }
87 + List thisList = counts.get(collector.getName());
88 + thisList.add(collector.getCollectionCount());
90 89 }
91 - return count;
92 90 }
93 -
94 91 }
95 -
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX