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 */
23
24 import com.oracle.java.testlibrary.*;
25
26 /*
27 * @test CheckSegmentedCodeCache
28 * @bug 8015774
29 * @summary "Checks VM options related to the segmented code cache"
30 * @library /testlibrary
31 * @run main/othervm CheckSegmentedCodeCache
32 */
33 public class CheckSegmentedCodeCache {
34 // Code heap names
35 private static final String NON_METHOD = "CodeHeap 'non-nmethods'";
36 private static final String PROFILED = "CodeHeap 'profiled nmethods'";
37 private static final String NON_PROFILED = "CodeHeap 'non-profiled nmethods'";
38
39 private static void verifySegmentedCodeCache(ProcessBuilder pb, boolean enabled) throws Exception {
40 OutputAnalyzer out = new OutputAnalyzer(pb.start());
41 out.shouldHaveExitValue(0);
42 if (enabled) {
43 try {
44 // Non-nmethod code heap should be always available with the segmented code cache
45 out.shouldContain(NON_METHOD);
46 } catch (RuntimeException e) {
47 // Check if TieredCompilation is disabled (in a client VM)
48 if(!out.getOutput().contains("TieredCompilation is disabled in this release.")) {
49 // Code cache is not segmented
50 throw new RuntimeException("No code cache segmentation.");
51 }
52 }
53 } else {
116 "-XX:+PrintCodeCache", "-version");
117 verifyCodeHeapNotExists(pb, PROFILED);
118 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
119 "-XX:TieredStopAtLevel=1",
120 "-XX:+PrintCodeCache", "-version");
121 verifyCodeHeapNotExists(pb, PROFILED);
122
123 // Fails with too small non-nmethod code heap size
124 pb = ProcessTools.createJavaProcessBuilder("-XX:NonNMethodCodeHeapSize=100K");
125 failsWith(pb, "Invalid NonNMethodCodeHeapSize");
126
127 // Fails if code heap sizes do not add up
128 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
129 "-XX:ReservedCodeCacheSize=10M",
130 "-XX:NonNMethodCodeHeapSize=5M",
131 "-XX:ProfiledCodeHeapSize=5M",
132 "-XX:NonProfiledCodeHeapSize=5M");
133 failsWith(pb, "Invalid code heap sizes");
134
135 // Fails if not enough space for VM internal code
136 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
137 "-XX:ReservedCodeCacheSize=1700K",
138 "-XX:InitialCodeCacheSize=100K");
139 failsWith(pb, "Not enough space in non-nmethod code heap to run VM");
140 }
141 }
|
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 */
23
24 import com.oracle.java.testlibrary.*;
25 import sun.hotspot.WhiteBox;
26
27 /*
28 * @test CheckSegmentedCodeCache
29 * @bug 8015774
30 * @library /testlibrary /testlibrary/whitebox
31 * @summary "Checks VM options related to the segmented code cache"
32 * @build CheckSegmentedCodeCache
33 * @run main ClassFileInstaller sun.hotspot.WhiteBox
34 * sun.hotspot.WhiteBox$WhiteBoxPermission
35 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI CheckSegmentedCodeCache
36 */
37 public class CheckSegmentedCodeCache {
38 private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
39 // Code heap names
40 private static final String NON_METHOD = "CodeHeap 'non-nmethods'";
41 private static final String PROFILED = "CodeHeap 'profiled nmethods'";
42 private static final String NON_PROFILED = "CodeHeap 'non-profiled nmethods'";
43
44 private static void verifySegmentedCodeCache(ProcessBuilder pb, boolean enabled) throws Exception {
45 OutputAnalyzer out = new OutputAnalyzer(pb.start());
46 out.shouldHaveExitValue(0);
47 if (enabled) {
48 try {
49 // Non-nmethod code heap should be always available with the segmented code cache
50 out.shouldContain(NON_METHOD);
51 } catch (RuntimeException e) {
52 // Check if TieredCompilation is disabled (in a client VM)
53 if(!out.getOutput().contains("TieredCompilation is disabled in this release.")) {
54 // Code cache is not segmented
55 throw new RuntimeException("No code cache segmentation.");
56 }
57 }
58 } else {
121 "-XX:+PrintCodeCache", "-version");
122 verifyCodeHeapNotExists(pb, PROFILED);
123 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
124 "-XX:TieredStopAtLevel=1",
125 "-XX:+PrintCodeCache", "-version");
126 verifyCodeHeapNotExists(pb, PROFILED);
127
128 // Fails with too small non-nmethod code heap size
129 pb = ProcessTools.createJavaProcessBuilder("-XX:NonNMethodCodeHeapSize=100K");
130 failsWith(pb, "Invalid NonNMethodCodeHeapSize");
131
132 // Fails if code heap sizes do not add up
133 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
134 "-XX:ReservedCodeCacheSize=10M",
135 "-XX:NonNMethodCodeHeapSize=5M",
136 "-XX:ProfiledCodeHeapSize=5M",
137 "-XX:NonProfiledCodeHeapSize=5M");
138 failsWith(pb, "Invalid code heap sizes");
139
140 // Fails if not enough space for VM internal code
141 long minUseSpace = WHITE_BOX.getUintxVMFlag("CodeCacheMinimumUseSpace");
142 long minFreeSpace = WHITE_BOX.getUintxVMFlag("CodeCacheMinimumFreeSpace");
143 // minimum size: (CodeCacheMinimumUseSpace DEBUG_ONLY(* 3)) + CodeCacheMinimumFreeSpace
144 long minSize = (Platform.isDebugBuild() ? 3 : 1) * minUseSpace + minFreeSpace;
145 pb = ProcessTools.createJavaProcessBuilder("-XX:+SegmentedCodeCache",
146 "-XX:ReservedCodeCacheSize=" + minSize,
147 "-XX:InitialCodeCacheSize=100K");
148 failsWith(pb, "Not enough space in non-nmethod code heap to run VM");
149 }
150 }
|