test/gc/arguments/TestMaxHeapSizeTools.java

Print this page

        

@@ -23,10 +23,12 @@
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 
 import com.oracle.java.testlibrary.*;
 import sun.hotspot.WhiteBox;
 
 class ErgoArgsPrinter {

@@ -39,12 +41,12 @@
 final class MinInitialMaxValues {
   public long minHeapSize;
   public long initialHeapSize;
   public long maxHeapSize;
 
-  public long minAlignment;
-  public long maxAlignment;
+  public long spaceAlignment;
+  public long heapAlignment;
 }
 
 class TestMaxHeapSizeTools {
 
   public static void checkMinInitialMaxHeapFlags(String gcflag) throws Exception {

@@ -179,53 +181,60 @@
     output.shouldHaveExitValue(0);
 
     return output;
   }
 
-  private static void getMinInitialMaxHeap(String[] args, MinInitialMaxValues val) throws Exception {
-    OutputAnalyzer output = runWhiteBoxTest(args, ErgoArgsPrinter.class.getName(), new String[] {}, false);
+  private static void getMinInitialMaxHeap(String[] args, MinInitialMaxValues val, Boolean[] parallelGC) throws Exception {
+    List<String> argsList = new ArrayList<>();
+    Collections.addAll(argsList, args);
+    Collections.addAll(argsList, "-XX:+PrintFlagsFinal");
+
+    OutputAnalyzer output = runWhiteBoxTest(argsList.toArray(new String[0]), ErgoArgsPrinter.class.getName(), new String[0], false);
+    String stdOut = output.getStdout();
+
+    parallelGC[0] = FlagsValue.getFlagBoolValue(stdOut, "UseParallelGC");
 
     // the output we watch for has the following format:
     //
-    // "Minimum heap X Initial heap Y Maximum heap Z Min alignment A Max Alignment B"
+    // "Minimum heap X Initial heap Y Maximum heap Z Space alignment A Heap alignment B"
     //
     // where A, B, X, Y and Z are sizes in bytes.
     // Unfortunately there is no other way to retrieve the minimum heap size and
     // the alignments.
-
-    Matcher m = Pattern.compile("Minimum heap \\d+ Initial heap \\d+ Maximum heap \\d+ Min alignment \\d+ Max alignment \\d+").
-      matcher(output.getStdout());
+    Matcher m = Pattern.
+      compile("Minimum heap \\d+ Initial heap \\d+ Maximum heap \\d+ Space alignment \\d+ Heap alignment \\d+").
+      matcher(stdOut);
     if (!m.find()) {
       throw new RuntimeException("Could not find heap size string.");
     }
 
     String match = m.group();
 
     // actual values
     val.minHeapSize = valueAfter(match, "Minimum heap ");
     val.initialHeapSize = valueAfter(match, "Initial heap ");
     val.maxHeapSize = valueAfter(match, "Maximum heap ");
-    val.minAlignment = valueAfter(match, "Min alignment ");
-    val.maxAlignment = valueAfter(match, "Max alignment ");
+    val.spaceAlignment = valueAfter(match, "Space alignment ");
+    val.heapAlignment = valueAfter(match, "Heap alignment ");
   }
 
   /**
    * Verify whether the VM automatically synchronizes minimum and initial heap size if only
    * one is given for the GC specified.
    */
   public static void checkErgonomics(String[] args, long[] newoldsize,
     long expectedMin, long expectedInitial) throws Exception {
 
     MinInitialMaxValues v = new MinInitialMaxValues();
-    getMinInitialMaxHeap(args, v);
+    getMinInitialMaxHeap(args, v, new Boolean[1]);
 
-    if ((expectedMin != -1) && (align_up(expectedMin, v.minAlignment) != v.minHeapSize)) {
+    if ((expectedMin != -1) && (align_up(expectedMin, v.spaceAlignment) != v.minHeapSize)) {
       throw new RuntimeException("Actual minimum heap size of " + v.minHeapSize +
         " differs from expected minimum heap size of " + expectedMin);
     }
 
-    if ((expectedInitial != -1) && (align_up(expectedInitial, v.minAlignment) != v.initialHeapSize)) {
+    if ((expectedInitial != -1) && (align_up(expectedInitial, v.spaceAlignment) != v.initialHeapSize)) {
       throw new RuntimeException("Actual initial heap size of " + v.initialHeapSize +
         " differs from expected initial heap size of " + expectedInitial);
     }
 
     // always check the invariant min <= initial <= max heap size

@@ -243,14 +252,20 @@
    */
   public static void checkGenMaxHeapSize(String gcflag, long maxHeapsize) throws Exception {
     final long K = 1024;
 
     MinInitialMaxValues v = new MinInitialMaxValues();
-    getMinInitialMaxHeap(new String[] { gcflag, "-XX:MaxHeapSize=" + maxHeapsize + "M" }, v);
+    Boolean[] parallelGC = new Boolean[1];
+    getMinInitialMaxHeap(new String[] { gcflag, "-XX:MaxHeapSize=" + maxHeapsize + "M" }, v, parallelGC);
 
-    long expectedHeapSize = align_up(maxHeapsize * K * K, v.maxAlignment);
     long actualHeapSize = v.maxHeapSize;
+    long expectedHeapSize = align_up(maxHeapsize * K * K, v.heapAlignment);
+    if (parallelGC[0] == true) {
+      // numberOfSpaces is for tenured space, eden space, from space and to space 
+      int numberOfSpaces = 4;
+      expectedHeapSize = Math.max(expectedHeapSize, numberOfSpaces * v.spaceAlignment);
+    }
 
     if (actualHeapSize > expectedHeapSize) {
       throw new RuntimeException("Heap has " + actualHeapSize  +
         " bytes, expected to be less than " + expectedHeapSize);
     }