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
↓ 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