test/gc/g1/TestSummarizeRSetStats.java

Thu, 19 Sep 2013 09:36:51 -0700

author
cl
date
Thu, 19 Sep 2013 09:36:51 -0700
changeset 5664
34aa07e92d22
parent 5204
e72f7eecc96d
child 5807
c319b188c7b2
permissions
-rw-r--r--

Added tag jdk8-b108 for changeset 85072013aad4

     1 /*
     2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     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
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  */
    24 /*
    25  * @test TestSummarizeRSetStats.java
    26  * @bug 8013895
    27  * @library /testlibrary
    28  * @build TestSummarizeRSetStats
    29  * @summary Verify output of -XX:+G1SummarizeRSetStats
    30  * @run main TestSummarizeRSetStats
    31  *
    32  * Test the output of G1SummarizeRSetStats in conjunction with G1SummarizeRSetStatsPeriod.
    33  */
    35 import com.oracle.java.testlibrary.*;
    36 import java.lang.Thread;
    37 import java.util.ArrayList;
    38 import java.util.Arrays;
    40 class RunSystemGCs {
    41     // 4M size, both are directly allocated into the old gen
    42     static Object[] largeObject1 = new Object[1024 * 1024];
    43     static Object[] largeObject2 = new Object[1024 * 1024];
    45     static int[] temp;
    47     public static void main(String[] args) {
    48         // create some cross-references between these objects
    49         for (int i = 0; i < largeObject1.length; i++) {
    50             largeObject1[i] = largeObject2;
    51         }
    53         for (int i = 0; i < largeObject2.length; i++) {
    54             largeObject2[i] = largeObject1;
    55         }
    57         int numGCs = Integer.parseInt(args[0]);
    59         if (numGCs > 0) {
    60             // try to force a minor collection: the young gen is 4M, the
    61             // amount of data allocated below is roughly that (4*1024*1024 +
    62             // some header data)
    63             for (int i = 0; i < 1024 ; i++) {
    64                 temp = new int[1024];
    65             }
    66         }
    68         for (int i = 0; i < numGCs - 1; i++) {
    69             System.gc();
    70         }
    71     }
    72 }
    74 public class TestSummarizeRSetStats {
    76     public static String runTest(String[] additionalArgs, int numGCs) throws Exception {
    77         ArrayList<String> finalargs = new ArrayList<String>();
    78         String[] defaultArgs = new String[] {
    79             "-XX:+UseG1GC",
    80             "-Xmn4m",
    81             "-Xmx20m",
    82             "-XX:InitiatingHeapOccupancyPercent=100", // we don't want the additional GCs due to initial marking
    83             "-XX:+PrintGC",
    84             "-XX:+UnlockDiagnosticVMOptions",
    85             "-XX:G1HeapRegionSize=1M",
    86         };
    88         finalargs.addAll(Arrays.asList(defaultArgs));
    90         if (additionalArgs != null) {
    91             finalargs.addAll(Arrays.asList(additionalArgs));
    92         }
    94         finalargs.add(RunSystemGCs.class.getName());
    95         finalargs.add(String.valueOf(numGCs));
    97         ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
    98             finalargs.toArray(new String[0]));
    99         OutputAnalyzer output = new OutputAnalyzer(pb.start());
   101         output.shouldHaveExitValue(0);
   103         String result = output.getStdout();
   104         return result;
   105     }
   107     private static void expectStatistics(String result, int expectedCumulative, int expectedPeriodic) throws Exception {
   108         int actualTotal = result.split("Concurrent RS processed").length - 1;
   109         int actualCumulative = result.split("Cumulative RS summary").length - 1;
   111         if (expectedCumulative != actualCumulative) {
   112             throw new Exception("Incorrect amount of RSet summaries at the end. Expected " + expectedCumulative + ", got " + actualCumulative);
   113         }
   115         if (expectedPeriodic != (actualTotal - actualCumulative)) {
   116             throw new Exception("Incorrect amount of per-period RSet summaries at the end. Expected " + expectedPeriodic + ", got " + (actualTotal - actualCumulative));
   117         }
   118     }
   120     public static void main(String[] args) throws Exception {
   121         String result;
   123         // no RSet statistics output
   124         result = runTest(null, 0);
   125         expectStatistics(result, 0, 0);
   127         // no RSet statistics output
   128         result = runTest(null, 2);
   129         expectStatistics(result, 0, 0);
   131         // no RSet statistics output
   132         result = runTest(new String[] { "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
   133         expectStatistics(result, 0, 0);
   135         // single RSet statistics output at the end
   136         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 0);
   137         expectStatistics(result, 1, 0);
   139         // single RSet statistics output at the end
   140         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats" }, 2);
   141         expectStatistics(result, 1, 0);
   143         // single RSet statistics output
   144         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 0);
   145         expectStatistics(result, 1, 0);
   147         // two times RSet statistics output
   148         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 1);
   149         expectStatistics(result, 1, 1);
   151         // four times RSet statistics output
   152         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=1" }, 3);
   153         expectStatistics(result, 1, 3);
   155         // three times RSet statistics output
   156         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=2" }, 3);
   157         expectStatistics(result, 1, 2);
   159         // single RSet statistics output
   160         result = runTest(new String[] { "-XX:+G1SummarizeRSetStats", "-XX:G1SummarizeRSetStatsPeriod=100" }, 3);
   161         expectStatistics(result, 1, 1);
   162     }
   163 }

mercurial