annotate test/gc/arguments/TestMaxHeapSizeTools.java @ 12233:40136aa2cdb1

8010722: assert: failed: heap size is too big for compressed oops Summary: Use conservative assumptions of required alignment for the various garbage collector components into account when determining the maximum heap size that supports compressed oops. Using this conservative value avoids several circular dependencies in the calculation. Reviewed-by: stefank, dholmes
author tschatzl
date Wed, 11 Sep 2013 16:25:02 +0200
parents 7a95933197d0
children 8f07aa079343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10284
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
1 /*
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
4 *
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
7 * published by the Free Software Foundation.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
8 *
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
13 * accompanied this code).
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
14 *
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
18 *
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
21 * questions.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
22 */
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
23
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
24 import java.util.regex.Matcher;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
25 import java.util.regex.Pattern;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
26 import java.util.ArrayList;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
27 import java.util.Arrays;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
28
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
29 import com.oracle.java.testlibrary.*;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
30 import sun.hotspot.WhiteBox;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
31
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
32 class ErgoArgsPrinter {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
33 public static void main(String[] args) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
34 WhiteBox wb = WhiteBox.getWhiteBox();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
35 wb.printHeapSizes();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
36 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
37 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
38
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
39 final class MinInitialMaxValues {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
40 public long minHeapSize;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
41 public long initialHeapSize;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
42 public long maxHeapSize;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
43
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
44 public long minAlignment;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
45 public long maxAlignment;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
46 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
47
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
48 class TestMaxHeapSizeTools {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
49
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
50 public static void checkMinInitialMaxHeapFlags(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
51 checkInvalidMinInitialHeapCombinations(gcflag);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
52 checkValidMinInitialHeapCombinations(gcflag);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
53 checkInvalidInitialMaxHeapCombinations(gcflag);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
54 checkValidInitialMaxHeapCombinations(gcflag);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
55 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
56
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
57 public static void checkMinInitialErgonomics(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
58 // heap sizing ergonomics use the value NewSize + OldSize as default values
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
59 // for ergonomics calculation. Retrieve these values.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
60 long[] values = new long[2];
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
61 getNewOldSize(gcflag, values);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
62
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
63 // we check cases with values smaller and larger than this default value.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
64 long newPlusOldSize = values[0] + values[1];
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
65 long smallValue = newPlusOldSize / 2;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
66 long largeValue = newPlusOldSize * 2;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
67
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
68 // -Xms is not set
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
69 checkErgonomics(new String[] { gcflag, "-Xmx16M" }, values, -1, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
70 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-XX:InitialHeapSize=" + smallValue }, values, smallValue, smallValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
71 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-XX:InitialHeapSize=" + largeValue }, values, -1, largeValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
72 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-XX:InitialHeapSize=0" }, values, -1, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
73
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
74 // -Xms is set to zero
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
75 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms0" }, values, -1, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
76 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms0", "-XX:InitialHeapSize=" + smallValue }, values, smallValue, smallValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
77 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms0", "-XX:InitialHeapSize=" + largeValue }, values, -1, largeValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
78 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms0", "-XX:InitialHeapSize=0" }, values, -1, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
79
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
80 // -Xms is set to small value
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
81 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + smallValue }, values, -1, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
82 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + smallValue, "-XX:InitialHeapSize=" + smallValue }, values, smallValue, smallValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
83 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + smallValue, "-XX:InitialHeapSize=" + largeValue }, values, smallValue, largeValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
84 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + smallValue, "-XX:InitialHeapSize=0" }, values, smallValue, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
85
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
86 // -Xms is set to large value
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
87 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + largeValue }, values, largeValue, largeValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
88 // the next case has already been checked elsewhere and gives an error
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
89 // checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + largeValue, "-XX:InitialHeapSize=" + smallValue }, values, smallValue, smallValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
90 // the next case has already been checked elsewhere too
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
91 // checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + largeValue, "-XX:InitialHeapSize=" + largeValue }, values, values[0], largeValue);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
92 checkErgonomics(new String[] { gcflag, "-Xmx16M", "-Xms" + largeValue, "-XX:InitialHeapSize=0" }, values, largeValue, -1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
93 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
94
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
95 private static long align_up(long value, long alignment) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
96 long alignmentMinusOne = alignment - 1;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
97 return (value + alignmentMinusOne) & ~alignmentMinusOne;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
98 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
99
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
100 private static void getNewOldSize(String gcflag, long[] values) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
101 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(gcflag,
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
102 "-XX:+PrintFlagsFinal", "-version");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
103 OutputAnalyzer output = new OutputAnalyzer(pb.start());
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
104 output.shouldHaveExitValue(0);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
105
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
106 String stdout = output.getStdout();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
107 values[0] = getFlagValue(" NewSize", stdout);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
108 values[1] = getFlagValue(" OldSize", stdout);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
109 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
110
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
111 public static void checkGenMaxHeapErgo(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
112 TestMaxHeapSizeTools.checkGenMaxHeapSize(gcflag, 3);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
113 TestMaxHeapSizeTools.checkGenMaxHeapSize(gcflag, 4);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
114 TestMaxHeapSizeTools.checkGenMaxHeapSize(gcflag, 5);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
115 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
116
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
117 private static void checkInvalidMinInitialHeapCombinations(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
118 expectError(new String[] { gcflag, "-Xms8M", "-XX:InitialHeapSize=4M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
119 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
120
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
121 private static void checkValidMinInitialHeapCombinations(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
122 expectValid(new String[] { gcflag, "-XX:InitialHeapSize=8M", "-Xms4M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
123 expectValid(new String[] { gcflag, "-Xms4M", "-XX:InitialHeapSize=8M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
124 expectValid(new String[] { gcflag, "-XX:InitialHeapSize=8M", "-Xms8M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
125 // the following is not an error as -Xms sets both minimal and initial heap size
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
126 expectValid(new String[] { gcflag, "-XX:InitialHeapSize=4M", "-Xms8M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
127 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
128
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
129 private static void checkInvalidInitialMaxHeapCombinations(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
130 expectError(new String[] { gcflag, "-XX:MaxHeapSize=4M", "-XX:InitialHeapSize=8M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
131 expectError(new String[] { gcflag, "-XX:InitialHeapSize=8M", "-XX:MaxHeapSize=4M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
132 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
133
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
134 private static void checkValidInitialMaxHeapCombinations(String gcflag) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
135 expectValid(new String[] { gcflag, "-XX:InitialHeapSize=4M", "-XX:MaxHeapSize=8M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
136 expectValid(new String[] { gcflag, "-XX:MaxHeapSize=8M", "-XX:InitialHeapSize=4M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
137 expectValid(new String[] { gcflag, "-XX:MaxHeapSize=4M", "-XX:InitialHeapSize=4M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
138 // a value of "0" for initial heap size means auto-detect
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
139 expectValid(new String[] { gcflag, "-XX:MaxHeapSize=4M", "-XX:InitialHeapSize=0M", "-version" });
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
140 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
141
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
142 private static long valueAfter(String source, String match) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
143 int start = source.indexOf(match) + match.length();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
144 String tail = source.substring(start).split(" ")[0];
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
145 return Long.parseLong(tail);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
146 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
147
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
148 /**
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
149 * Executes a new VM process with the given class and parameters.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
150 * @param vmargs Arguments to the VM to run
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
151 * @param classname Name of the class to run
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
152 * @param arguments Arguments to the class
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
153 * @param useTestDotJavaDotOpts Use test.java.opts as part of the VM argument string
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
154 * @return The OutputAnalyzer with the results for the invocation.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
155 */
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
156 public static OutputAnalyzer runWhiteBoxTest(String[] vmargs, String classname, String[] arguments, boolean useTestDotJavaDotOpts) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
157 ArrayList<String> finalargs = new ArrayList<String>();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
158
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
159 String[] whiteboxOpts = new String[] {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
160 "-Xbootclasspath/a:.",
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
161 "-XX:+UnlockDiagnosticVMOptions", "-XX:+WhiteBoxAPI",
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
162 "-cp", System.getProperty("java.class.path"),
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
163 };
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
164
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
165 if (useTestDotJavaDotOpts) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
166 // System.getProperty("test.java.opts") is '' if no options is set,
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
167 // we need to skip such a result
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
168 String[] externalVMOpts = new String[0];
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
169 if (System.getProperty("test.java.opts") != null && System.getProperty("test.java.opts").length() != 0) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
170 externalVMOpts = System.getProperty("test.java.opts").split(" ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
171 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
172 finalargs.addAll(Arrays.asList(externalVMOpts));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
173 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
174
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
175 finalargs.addAll(Arrays.asList(vmargs));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
176 finalargs.addAll(Arrays.asList(whiteboxOpts));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
177 finalargs.add(classname);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
178 finalargs.addAll(Arrays.asList(arguments));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
179
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
180 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(finalargs.toArray(new String[0]));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
181 OutputAnalyzer output = new OutputAnalyzer(pb.start());
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
182 output.shouldHaveExitValue(0);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
183
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
184 return output;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
185 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
186
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
187 private static void getMinInitialMaxHeap(String[] args, MinInitialMaxValues val) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
188 OutputAnalyzer output = runWhiteBoxTest(args, ErgoArgsPrinter.class.getName(), new String[] {}, false);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
189
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
190 // the output we watch for has the following format:
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
191 //
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
192 // "Minimum heap X Initial heap Y Maximum heap Z Min alignment A Max Alignment B"
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
193 //
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
194 // where A, B, X, Y and Z are sizes in bytes.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
195 // Unfortunately there is no other way to retrieve the minimum heap size and
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
196 // the alignments.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
197
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
198 Matcher m = Pattern.compile("Minimum heap \\d+ Initial heap \\d+ Maximum heap \\d+ Min alignment \\d+ Max alignment \\d+").
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
199 matcher(output.getStdout());
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
200 if (!m.find()) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
201 throw new RuntimeException("Could not find heap size string.");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
202 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
203
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
204 String match = m.group();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
205
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
206 // actual values
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
207 val.minHeapSize = valueAfter(match, "Minimum heap ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
208 val.initialHeapSize = valueAfter(match, "Initial heap ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
209 val.maxHeapSize = valueAfter(match, "Maximum heap ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
210 val.minAlignment = valueAfter(match, "Min alignment ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
211 val.maxAlignment = valueAfter(match, "Max alignment ");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
212 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
213
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
214 /**
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
215 * Verify whether the VM automatically synchronizes minimum and initial heap size if only
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
216 * one is given for the GC specified.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
217 */
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
218 public static void checkErgonomics(String[] args, long[] newoldsize,
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
219 long expectedMin, long expectedInitial) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
220
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
221 MinInitialMaxValues v = new MinInitialMaxValues();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
222 getMinInitialMaxHeap(args, v);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
223
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
224 if ((expectedMin != -1) && (align_up(expectedMin, v.minAlignment) != v.minHeapSize)) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
225 throw new RuntimeException("Actual minimum heap size of " + v.minHeapSize +
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
226 " differs from expected minimum heap size of " + expectedMin);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
227 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
228
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
229 if ((expectedInitial != -1) && (align_up(expectedInitial, v.minAlignment) != v.initialHeapSize)) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
230 throw new RuntimeException("Actual initial heap size of " + v.initialHeapSize +
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
231 " differs from expected initial heap size of " + expectedInitial);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
232 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
233
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
234 // always check the invariant min <= initial <= max heap size
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
235 if (!(v.minHeapSize <= v.initialHeapSize && v.initialHeapSize <= v.maxHeapSize)) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
236 throw new RuntimeException("Inconsistent min/initial/max heap sizes, they are " +
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
237 v.minHeapSize + "/" + v.initialHeapSize + "/" + v.maxHeapSize);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
238 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
239 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
240
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
241 /**
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
242 * Verify whether the VM respects the given maximum heap size in MB for the
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
243 * GC specified.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
244 * @param gcflag The garbage collector to test as command line flag. E.g. -XX:+UseG1GC
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
245 * @param maxHeapSize the maximum heap size to verify, in MB.
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
246 */
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
247 public static void checkGenMaxHeapSize(String gcflag, long maxHeapsize) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
248 final long K = 1024;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
249
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
250 MinInitialMaxValues v = new MinInitialMaxValues();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
251 getMinInitialMaxHeap(new String[] { gcflag, "-XX:MaxHeapSize=" + maxHeapsize + "M" }, v);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
252
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
253 long expectedHeapSize = align_up(maxHeapsize * K * K, v.maxAlignment);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
254 long actualHeapSize = v.maxHeapSize;
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
255
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
256 if (actualHeapSize > expectedHeapSize) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
257 throw new RuntimeException("Heap has " + actualHeapSize +
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
258 " bytes, expected to be less than " + expectedHeapSize);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
259 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
260 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
261
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
262 private static long getFlagValue(String flag, String where) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
263 Matcher m = Pattern.compile(flag + "\\s+:?=\\s+\\d+").matcher(where);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
264 if (!m.find()) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
265 throw new RuntimeException("Could not find value for flag " + flag + " in output string");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
266 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
267 String match = m.group();
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
268 return Long.parseLong(match.substring(match.lastIndexOf(" ") + 1, match.length()));
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
269 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
270
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
271 private static void shouldContainOrNot(OutputAnalyzer output, boolean contains, String message) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
272 if (contains) {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
273 output.shouldContain(message);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
274 } else {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
275 output.shouldNotContain(message);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
276 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
277 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
278
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
279 private static void expect(String[] flags, boolean hasWarning, boolean hasError, int errorcode) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
280 ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(flags);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
281 OutputAnalyzer output = new OutputAnalyzer(pb.start());
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
282 shouldContainOrNot(output, hasWarning, "Warning");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
283 shouldContainOrNot(output, hasError, "Error");
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
284 output.shouldHaveExitValue(errorcode);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
285 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
286
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
287 private static void expectError(String[] flags) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
288 expect(flags, false, true, 1);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
289 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
290
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
291 private static void expectValid(String[] flags) throws Exception {
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
292 expect(flags, false, false, 0);
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
293 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
294 }
7a95933197d0 8014058: Regression tests for 8006088
tschatzl
parents:
diff changeset
295