hotspot/test/gc/7072527/TestFullGCCount.java
changeset 17102 fd0261ab7079
parent 10240 c3931827e0cf
child 29678 dd2f3932c21e
equal deleted inserted replaced
16998:d61c4c63f619 17102:fd0261ab7079
     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  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
    23 
    23 
    24 /*
    24 /*
    25  * @test TestFullGCount.java
    25  * @test TestFullGCount.java
    26  * @bug 7072527
    26  * @bug 7072527
    27  * @summary CMS: JMM GC counters overcount in some cases
    27  * @summary CMS: JMM GC counters overcount in some cases
    28  * @run main/othervm -XX:+UseConcMarkSweepGC TestFullGCCount
    28  * @run main/othervm -XX:+PrintGC TestFullGCCount
    29  *
       
    30  */
    29  */
    31 import java.util.*;
    30 import java.util.*;
    32 import java.lang.management.*;
    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 public class TestFullGCCount {
    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;
    47         // Prime the collection of count lists for all collectors.
    41         if (args.length==2) {
    48         for (int i = 0; i < collectors.size(); i++) {
    42             t = new TestFullGCCount(args[0], args[1]);
    49             GarbageCollectorMXBean collector = collectors.get(i);
    43         } else {
    50             counts.put(collector.getName(), new ArrayList<Long>(iterations));
    44             t = new TestFullGCCount();
       
    45         }
    51         }
    46         System.out.println("Monitoring collector: " + t.collectorName);
       
    47         t.run();
       
    48     }
       
    49 
    52 
    50     public TestFullGCCount(String pool, String collector) {
    53         // Perform some gc, record collector counts.
    51         collectorName = collector;
    54         for (int i = 0; i < iterations; i++) {
    52     }
    55             System.gc();
       
    56             addCollectionCount(counts, i);
       
    57         }
    53 
    58 
    54     public TestFullGCCount() {
    59         // Check the increments:
    55     }
    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() {
    66             for (int i = 0; i < iterations - 1; i++) {
    58         int count = 0;
    67                 List<Long> theseCounts = counts.get(collector);
    59         int iterations = 20;
    68                 long a = theseCounts.get(i);
    60         long counts[] = new long[iterations];
    69                 long b = theseCounts.get(i + 1);
    61         boolean diffAlways2 = true; // assume we will fail
    70                 if (b - a >= 2) {
    62 
    71                     failed = true;
    63         for (int i=0; i<iterations; i++) {
    72                     errorMessage += "Collector '" + collector + "' has increment " + (b - a) +
    64             System.gc();
    73                                     " at iteration " + i + "\n";
    65             counts[i] = getCollectionCount();
       
    66             if (i>0) {
       
    67                 if (counts[i] - counts[i-1] != 2) {
       
    68                     diffAlways2 = false;
       
    69                 }
    74                 }
    70             }
    75             }
    71         }
    76         }
    72         if (diffAlways2) {
    77         if (failed) {
    73             throw new RuntimeException("FAILED: System.gc must be incrementing count twice.");
    78             System.err.println(errorMessage);
       
    79             throw new RuntimeException("FAILED: System.gc collections miscounted.");
    74         }
    80         }
    75         System.out.println("Passed.");
    81         System.out.println("Passed.");
    76     }
    82     }
    77 
    83 
    78     private long getCollectionCount() {
    84     private static void addCollectionCount(HashMap<String, List> counts, int iteration) {
    79         long count = 0;
    85         for (int i = 0; i < collectors.size(); i++) {
    80         List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
       
    81         List<GarbageCollectorMXBean> collectors = ManagementFactory.getGarbageCollectorMXBeans();
       
    82         for (int i=0; i<collectors.size(); i++) {
       
    83             GarbageCollectorMXBean collector = collectors.get(i);
    86             GarbageCollectorMXBean collector = collectors.get(i);
    84             String name = collector.getName();
    87             List thisList = counts.get(collector.getName());
    85             if (name.contains(collectorName)) {
    88             thisList.add(collector.getCollectionCount());
    86                 System.out.println(name + ": collection count = "
       
    87                                    + collector.getCollectionCount());
       
    88                 count = collector.getCollectionCount();
       
    89             }
       
    90         }
    89         }
    91         return count;
       
    92     }
    90     }
    93 
       
    94 }
    91 }
    95