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);
}