Mercurial > hg > truffle
annotate src/share/vm/runtime/arguments.cpp @ 4597:8bc6f680a88d
fixed visual studio project files
author | Christian Haeubl <christian.haeubl@oracle.com> |
---|---|
date | Tue, 14 Feb 2012 15:01:36 -0800 |
parents | 5b04b33dac74 |
children | 33df1aeaebbf |
rev | line source |
---|---|
0 | 1 /* |
2129
8f8dfba37802
6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents:
2095
diff
changeset
|
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaAssertions.hpp" | |
27 #include "compiler/compilerOracle.hpp" | |
28 #include "memory/allocation.inline.hpp" | |
29 #include "memory/cardTableRS.hpp" | |
30 #include "memory/referenceProcessor.hpp" | |
31 #include "memory/universe.inline.hpp" | |
32 #include "oops/oop.inline.hpp" | |
33 #include "prims/jvmtiExport.hpp" | |
34 #include "runtime/arguments.hpp" | |
35 #include "runtime/globals_extension.hpp" | |
36 #include "runtime/java.hpp" | |
37 #include "services/management.hpp" | |
38 #include "utilities/defaultStream.hpp" | |
39 #include "utilities/taskqueue.hpp" | |
40 #ifdef TARGET_OS_FAMILY_linux | |
41 # include "os_linux.inline.hpp" | |
42 #endif | |
43 #ifdef TARGET_OS_FAMILY_solaris | |
44 # include "os_solaris.inline.hpp" | |
45 #endif | |
46 #ifdef TARGET_OS_FAMILY_windows | |
47 # include "os_windows.inline.hpp" | |
48 #endif | |
3960 | 49 #ifdef TARGET_OS_FAMILY_bsd |
50 # include "os_bsd.inline.hpp" | |
51 #endif | |
1972 | 52 #ifndef SERIALGC |
53 #include "gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp" | |
54 #endif | |
0 | 55 |
2474 | 56 // Note: This is a special bug reporting site for the JVM |
57 #define DEFAULT_VENDOR_URL_BUG "http://bugreport.sun.com/bugreport/crash.jsp" | |
0 | 58 #define DEFAULT_JAVA_LAUNCHER "generic" |
59 | |
60 char** Arguments::_jvm_flags_array = NULL; | |
61 int Arguments::_num_jvm_flags = 0; | |
62 char** Arguments::_jvm_args_array = NULL; | |
63 int Arguments::_num_jvm_args = 0; | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
64 #ifdef GRAAL |
2891
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
65 char** Arguments::_graal_args_array = NULL; |
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
66 int Arguments::_num_graal_args = 0; |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
67 #endif |
0 | 68 char* Arguments::_java_command = NULL; |
69 SystemProperty* Arguments::_system_properties = NULL; | |
70 const char* Arguments::_gc_log_filename = NULL; | |
71 bool Arguments::_has_profile = false; | |
72 bool Arguments::_has_alloc_profile = false; | |
73 uintx Arguments::_min_heap_size = 0; | |
74 Arguments::Mode Arguments::_mode = _mixed; | |
75 bool Arguments::_java_compiler = false; | |
76 bool Arguments::_xdebug_mode = false; | |
77 const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG; | |
78 const char* Arguments::_sun_java_launcher = DEFAULT_JAVA_LAUNCHER; | |
79 int Arguments::_sun_java_launcher_pid = -1; | |
2302
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
80 bool Arguments::_created_by_gamma_launcher = false; |
0 | 81 |
82 // These parameters are reset in method parse_vm_init_args(JavaVMInitArgs*) | |
83 bool Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods; | |
84 bool Arguments::_UseOnStackReplacement = UseOnStackReplacement; | |
85 bool Arguments::_BackgroundCompilation = BackgroundCompilation; | |
86 bool Arguments::_ClipInlining = ClipInlining; | |
87 | |
88 char* Arguments::SharedArchivePath = NULL; | |
89 | |
90 AgentLibraryList Arguments::_libraryList; | |
91 AgentLibraryList Arguments::_agentList; | |
92 | |
93 abort_hook_t Arguments::_abort_hook = NULL; | |
94 exit_hook_t Arguments::_exit_hook = NULL; | |
95 vfprintf_hook_t Arguments::_vfprintf_hook = NULL; | |
96 | |
97 | |
98 SystemProperty *Arguments::_java_ext_dirs = NULL; | |
99 SystemProperty *Arguments::_java_endorsed_dirs = NULL; | |
100 SystemProperty *Arguments::_sun_boot_library_path = NULL; | |
101 SystemProperty *Arguments::_java_library_path = NULL; | |
102 SystemProperty *Arguments::_java_home = NULL; | |
103 SystemProperty *Arguments::_java_class_path = NULL; | |
104 SystemProperty *Arguments::_sun_boot_class_path = NULL; | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
105 #ifdef GRAAL |
3546
4aa80ca3dbec
Separate compiler bootstrappath from application bootstrappath.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3544
diff
changeset
|
106 SystemProperty *Arguments::_compiler_class_path = NULL; |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
107 #endif |
0 | 108 |
109 char* Arguments::_meta_index_path = NULL; | |
110 char* Arguments::_meta_index_dir = NULL; | |
111 | |
112 static bool force_client_mode = false; | |
113 | |
114 // Check if head of 'option' matches 'name', and sets 'tail' remaining part of option string | |
115 | |
116 static bool match_option(const JavaVMOption *option, const char* name, | |
117 const char** tail) { | |
118 int len = (int)strlen(name); | |
119 if (strncmp(option->optionString, name, len) == 0) { | |
120 *tail = option->optionString + len; | |
121 return true; | |
122 } else { | |
123 return false; | |
124 } | |
125 } | |
126 | |
127 static void logOption(const char* opt) { | |
128 if (PrintVMOptions) { | |
129 jio_fprintf(defaultStream::output_stream(), "VM option '%s'\n", opt); | |
130 } | |
131 } | |
132 | |
133 // Process java launcher properties. | |
134 void Arguments::process_sun_java_launcher_properties(JavaVMInitArgs* args) { | |
135 // See if sun.java.launcher or sun.java.launcher.pid is defined. | |
136 // Must do this before setting up other system properties, | |
137 // as some of them may depend on launcher type. | |
138 for (int index = 0; index < args->nOptions; index++) { | |
139 const JavaVMOption* option = args->options + index; | |
140 const char* tail; | |
141 | |
142 if (match_option(option, "-Dsun.java.launcher=", &tail)) { | |
143 process_java_launcher_argument(tail, option->extraInfo); | |
144 continue; | |
145 } | |
146 if (match_option(option, "-Dsun.java.launcher.pid=", &tail)) { | |
147 _sun_java_launcher_pid = atoi(tail); | |
148 continue; | |
149 } | |
150 } | |
151 } | |
152 | |
153 // Initialize system properties key and value. | |
154 void Arguments::init_system_properties() { | |
155 | |
156 PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.name", | |
157 "Java Virtual Machine Specification", false)); | |
158 PropertyList_add(&_system_properties, new SystemProperty("java.vm.version", VM_Version::vm_release(), false)); | |
159 PropertyList_add(&_system_properties, new SystemProperty("java.vm.name", VM_Version::vm_name(), false)); | |
160 PropertyList_add(&_system_properties, new SystemProperty("java.vm.info", VM_Version::vm_info_string(), true)); | |
161 | |
162 // following are JVMTI agent writeable properties. | |
163 // Properties values are set to NULL and they are | |
164 // os specific they are initialized in os::init_system_properties_values(). | |
165 _java_ext_dirs = new SystemProperty("java.ext.dirs", NULL, true); | |
166 _java_endorsed_dirs = new SystemProperty("java.endorsed.dirs", NULL, true); | |
167 _sun_boot_library_path = new SystemProperty("sun.boot.library.path", NULL, true); | |
168 _java_library_path = new SystemProperty("java.library.path", NULL, true); | |
169 _java_home = new SystemProperty("java.home", NULL, true); | |
170 _sun_boot_class_path = new SystemProperty("sun.boot.class.path", NULL, true); | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
171 #ifdef GRAAL |
3546
4aa80ca3dbec
Separate compiler bootstrappath from application bootstrappath.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3544
diff
changeset
|
172 _compiler_class_path = new SystemProperty("compiler.class.path", NULL, true); |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
173 #endif |
0 | 174 |
175 _java_class_path = new SystemProperty("java.class.path", "", true); | |
176 | |
177 // Add to System Property list. | |
178 PropertyList_add(&_system_properties, _java_ext_dirs); | |
179 PropertyList_add(&_system_properties, _java_endorsed_dirs); | |
180 PropertyList_add(&_system_properties, _sun_boot_library_path); | |
181 PropertyList_add(&_system_properties, _java_library_path); | |
182 PropertyList_add(&_system_properties, _java_home); | |
183 PropertyList_add(&_system_properties, _java_class_path); | |
184 PropertyList_add(&_system_properties, _sun_boot_class_path); | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
185 #ifdef GRAAL |
3546
4aa80ca3dbec
Separate compiler bootstrappath from application bootstrappath.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3544
diff
changeset
|
186 PropertyList_add(&_system_properties, _compiler_class_path); |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
187 #endif |
0 | 188 |
189 // Set OS specific system properties values | |
190 os::init_system_properties_values(); | |
191 } | |
192 | |
1864
dfb38ea7da17
6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents:
1805
diff
changeset
|
193 |
dfb38ea7da17
6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents:
1805
diff
changeset
|
194 // Update/Initialize System properties after JDK version number is known |
dfb38ea7da17
6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents:
1805
diff
changeset
|
195 void Arguments::init_version_specific_system_properties() { |
1956
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
196 enum { bufsz = 16 }; |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
197 char buffer[bufsz]; |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
198 const char* spec_vendor = "Sun Microsystems Inc."; |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
199 uint32_t spec_version = 0; |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
200 |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
201 if (JDK_Version::is_gte_jdk17x_version()) { |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
202 spec_vendor = "Oracle Corporation"; |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
203 spec_version = JDK_Version::current().major_version(); |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
204 } |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
205 jio_snprintf(buffer, bufsz, "1." UINT32_FORMAT, spec_version); |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
206 |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
207 PropertyList_add(&_system_properties, |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
208 new SystemProperty("java.vm.specification.vendor", spec_vendor, false)); |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
209 PropertyList_add(&_system_properties, |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
210 new SystemProperty("java.vm.specification.version", buffer, false)); |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
211 PropertyList_add(&_system_properties, |
35f885165c69
6981737: The java.vm.specification.version property is 1.0, seems like it should be 2.0
kamg
parents:
1875
diff
changeset
|
212 new SystemProperty("java.vm.vendor", VM_Version::vm_vendor(), false)); |
1864
dfb38ea7da17
6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents:
1805
diff
changeset
|
213 } |
dfb38ea7da17
6988363: Rebrand vm vendor property settings (jdk7 only)
zgu
parents:
1805
diff
changeset
|
214 |
242 | 215 /** |
216 * Provide a slightly more user-friendly way of eliminating -XX flags. | |
217 * When a flag is eliminated, it can be added to this list in order to | |
218 * continue accepting this flag on the command-line, while issuing a warning | |
219 * and ignoring the value. Once the JDK version reaches the 'accept_until' | |
220 * limit, we flatly refuse to admit the existence of the flag. This allows | |
221 * a flag to die correctly over JDK releases using HSX. | |
222 */ | |
223 typedef struct { | |
224 const char* name; | |
225 JDK_Version obsoleted_in; // when the flag went away | |
226 JDK_Version accept_until; // which version to start denying the existence | |
227 } ObsoleteFlag; | |
0 | 228 |
242 | 229 static ObsoleteFlag obsolete_jvm_flags[] = { |
230 { "UseTrainGC", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
231 { "UseSpecialLargeObjectHandling", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
232 { "UseOversizedCarHandling", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
233 { "TraceCarAllocation", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
234 { "PrintTrainGCProcessingStats", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
235 { "LogOfCarSpaceSize", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
236 { "OversizedCarThreshold", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
237 { "MinTickInterval", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
238 { "DefaultTickInterval", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
239 { "MaxTickInterval", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
240 { "DelayTickAdjustment", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
241 { "ProcessingToTenuringRatio", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
242 { "MinTrainLength", JDK_Version::jdk(5), JDK_Version::jdk(7) }, | |
243 { "AppendRatio", JDK_Version::jdk_update(6,10), JDK_Version::jdk(7) }, | |
1064 | 244 { "DefaultMaxRAM", JDK_Version::jdk_update(6,18), JDK_Version::jdk(7) }, |
245 { "DefaultInitialRAMFraction", | |
246 JDK_Version::jdk_update(6,18), JDK_Version::jdk(7) }, | |
1706
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1628
diff
changeset
|
247 { "UseDepthFirstScavengeOrder", |
9d7a8ab3736b
6962589: remove breadth first scanning code from parallel gc
tonyp
parents:
1628
diff
changeset
|
248 JDK_Version::jdk_update(6,22), JDK_Version::jdk(7) }, |
1888
a7214d79fcf1
6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents:
1832
diff
changeset
|
249 { "HandlePromotionFailure", |
a7214d79fcf1
6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents:
1832
diff
changeset
|
250 JDK_Version::jdk_update(6,24), JDK_Version::jdk(8) }, |
a7214d79fcf1
6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents:
1832
diff
changeset
|
251 { "MaxLiveObjectEvacuationRatio", |
a7214d79fcf1
6896603: CMS/GCH: collection_attempt_is_safe() ergo should use more recent data
ysr
parents:
1832
diff
changeset
|
252 JDK_Version::jdk_update(6,24), JDK_Version::jdk(8) }, |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
253 { "ForceSharedSpaces", JDK_Version::jdk_update(6,25), JDK_Version::jdk(8) }, |
3251
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
254 { "UseParallelOldGCCompacting", |
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
255 JDK_Version::jdk_update(6,27), JDK_Version::jdk(8) }, |
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
256 { "UseParallelDensePrefixUpdate", |
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
257 JDK_Version::jdk_update(6,27), JDK_Version::jdk(8) }, |
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
258 { "UseParallelOldGCDensePrefix", |
eda9eb483d29
6841742: par compact - remove unused/unsupported options
jcoomes
parents:
3250
diff
changeset
|
259 JDK_Version::jdk_update(6,27), JDK_Version::jdk(8) }, |
2460 | 260 { "AllowTransitionalJSR292", JDK_Version::jdk(7), JDK_Version::jdk(8) }, |
3797
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
261 { "UseCompressedStrings", JDK_Version::jdk(7), JDK_Version::jdk(8) }, |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
262 #ifdef PRODUCT |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
263 { "DesiredMethodLimit", |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
264 JDK_Version::jdk_update(7, 2), JDK_Version::jdk(8) }, |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
265 #endif // PRODUCT |
242 | 266 { NULL, JDK_Version(0), JDK_Version(0) } |
267 }; | |
268 | |
269 // Returns true if the flag is obsolete and fits into the range specified | |
270 // for being ignored. In the case that the flag is ignored, the 'version' | |
271 // value is filled in with the version number when the flag became | |
272 // obsolete so that that value can be displayed to the user. | |
273 bool Arguments::is_newly_obsolete(const char *s, JDK_Version* version) { | |
0 | 274 int i = 0; |
242 | 275 assert(version != NULL, "Must provide a version buffer"); |
276 while (obsolete_jvm_flags[i].name != NULL) { | |
277 const ObsoleteFlag& flag_status = obsolete_jvm_flags[i]; | |
0 | 278 // <flag>=xxx form |
279 // [-|+]<flag> form | |
242 | 280 if ((strncmp(flag_status.name, s, strlen(flag_status.name)) == 0) || |
0 | 281 ((s[0] == '+' || s[0] == '-') && |
242 | 282 (strncmp(flag_status.name, &s[1], strlen(flag_status.name)) == 0))) { |
283 if (JDK_Version::current().compare(flag_status.accept_until) == -1) { | |
284 *version = flag_status.obsoleted_in; | |
285 return true; | |
286 } | |
0 | 287 } |
288 i++; | |
289 } | |
290 return false; | |
291 } | |
292 | |
293 // Constructs the system class path (aka boot class path) from the following | |
294 // components, in order: | |
295 // | |
296 // prefix // from -Xbootclasspath/p:... | |
297 // endorsed // the expansion of -Djava.endorsed.dirs=... | |
298 // base // from os::get_system_properties() or -Xbootclasspath= | |
299 // suffix // from -Xbootclasspath/a:... | |
300 // | |
301 // java.endorsed.dirs is a list of directories; any jar or zip files in the | |
302 // directories are added to the sysclasspath just before the base. | |
303 // | |
304 // This could be AllStatic, but it isn't needed after argument processing is | |
305 // complete. | |
306 class SysClassPath: public StackObj { | |
307 public: | |
308 SysClassPath(const char* base); | |
309 ~SysClassPath(); | |
310 | |
311 inline void set_base(const char* base); | |
312 inline void add_prefix(const char* prefix); | |
531
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
313 inline void add_suffix_to_prefix(const char* suffix); |
0 | 314 inline void add_suffix(const char* suffix); |
315 inline void reset_path(const char* base); | |
316 | |
317 // Expand the jar/zip files in each directory listed by the java.endorsed.dirs | |
318 // property. Must be called after all command-line arguments have been | |
319 // processed (in particular, -Djava.endorsed.dirs=...) and before calling | |
320 // combined_path(). | |
321 void expand_endorsed(); | |
322 | |
323 inline const char* get_base() const { return _items[_scp_base]; } | |
324 inline const char* get_prefix() const { return _items[_scp_prefix]; } | |
325 inline const char* get_suffix() const { return _items[_scp_suffix]; } | |
326 inline const char* get_endorsed() const { return _items[_scp_endorsed]; } | |
327 | |
328 // Combine all the components into a single c-heap-allocated string; caller | |
329 // must free the string if/when no longer needed. | |
330 char* combined_path(); | |
331 | |
332 private: | |
333 // Utility routines. | |
334 static char* add_to_path(const char* path, const char* str, bool prepend); | |
335 static char* add_jars_to_path(char* path, const char* directory); | |
336 | |
337 inline void reset_item_at(int index); | |
338 | |
339 // Array indices for the items that make up the sysclasspath. All except the | |
340 // base are allocated in the C heap and freed by this class. | |
341 enum { | |
342 _scp_prefix, // from -Xbootclasspath/p:... | |
343 _scp_endorsed, // the expansion of -Djava.endorsed.dirs=... | |
344 _scp_base, // the default sysclasspath | |
345 _scp_suffix, // from -Xbootclasspath/a:... | |
346 _scp_nitems // the number of items, must be last. | |
347 }; | |
348 | |
349 const char* _items[_scp_nitems]; | |
350 DEBUG_ONLY(bool _expansion_done;) | |
351 }; | |
352 | |
353 SysClassPath::SysClassPath(const char* base) { | |
354 memset(_items, 0, sizeof(_items)); | |
355 _items[_scp_base] = base; | |
356 DEBUG_ONLY(_expansion_done = false;) | |
357 } | |
358 | |
359 SysClassPath::~SysClassPath() { | |
360 // Free everything except the base. | |
361 for (int i = 0; i < _scp_nitems; ++i) { | |
362 if (i != _scp_base) reset_item_at(i); | |
363 } | |
364 DEBUG_ONLY(_expansion_done = false;) | |
365 } | |
366 | |
367 inline void SysClassPath::set_base(const char* base) { | |
368 _items[_scp_base] = base; | |
369 } | |
370 | |
371 inline void SysClassPath::add_prefix(const char* prefix) { | |
372 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], prefix, true); | |
373 } | |
374 | |
531
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
375 inline void SysClassPath::add_suffix_to_prefix(const char* suffix) { |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
376 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], suffix, false); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
377 } |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
378 |
0 | 379 inline void SysClassPath::add_suffix(const char* suffix) { |
380 _items[_scp_suffix] = add_to_path(_items[_scp_suffix], suffix, false); | |
381 } | |
382 | |
383 inline void SysClassPath::reset_item_at(int index) { | |
384 assert(index < _scp_nitems && index != _scp_base, "just checking"); | |
385 if (_items[index] != NULL) { | |
386 FREE_C_HEAP_ARRAY(char, _items[index]); | |
387 _items[index] = NULL; | |
388 } | |
389 } | |
390 | |
391 inline void SysClassPath::reset_path(const char* base) { | |
392 // Clear the prefix and suffix. | |
393 reset_item_at(_scp_prefix); | |
394 reset_item_at(_scp_suffix); | |
395 set_base(base); | |
396 } | |
397 | |
398 //------------------------------------------------------------------------------ | |
399 | |
400 void SysClassPath::expand_endorsed() { | |
401 assert(_items[_scp_endorsed] == NULL, "can only be called once."); | |
402 | |
403 const char* path = Arguments::get_property("java.endorsed.dirs"); | |
404 if (path == NULL) { | |
405 path = Arguments::get_endorsed_dir(); | |
406 assert(path != NULL, "no default for java.endorsed.dirs"); | |
407 } | |
408 | |
409 char* expanded_path = NULL; | |
410 const char separator = *os::path_separator(); | |
411 const char* const end = path + strlen(path); | |
412 while (path < end) { | |
413 const char* tmp_end = strchr(path, separator); | |
414 if (tmp_end == NULL) { | |
415 expanded_path = add_jars_to_path(expanded_path, path); | |
416 path = end; | |
417 } else { | |
418 char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1); | |
419 memcpy(dirpath, path, tmp_end - path); | |
420 dirpath[tmp_end - path] = '\0'; | |
421 expanded_path = add_jars_to_path(expanded_path, dirpath); | |
422 FREE_C_HEAP_ARRAY(char, dirpath); | |
423 path = tmp_end + 1; | |
424 } | |
425 } | |
426 _items[_scp_endorsed] = expanded_path; | |
427 DEBUG_ONLY(_expansion_done = true;) | |
428 } | |
429 | |
430 // Combine the bootclasspath elements, some of which may be null, into a single | |
431 // c-heap-allocated string. | |
432 char* SysClassPath::combined_path() { | |
433 assert(_items[_scp_base] != NULL, "empty default sysclasspath"); | |
434 assert(_expansion_done, "must call expand_endorsed() first."); | |
435 | |
436 size_t lengths[_scp_nitems]; | |
437 size_t total_len = 0; | |
438 | |
439 const char separator = *os::path_separator(); | |
440 | |
441 // Get the lengths. | |
442 int i; | |
443 for (i = 0; i < _scp_nitems; ++i) { | |
444 if (_items[i] != NULL) { | |
445 lengths[i] = strlen(_items[i]); | |
446 // Include space for the separator char (or a NULL for the last item). | |
447 total_len += lengths[i] + 1; | |
448 } | |
449 } | |
450 assert(total_len > 0, "empty sysclasspath not allowed"); | |
451 | |
452 // Copy the _items to a single string. | |
453 char* cp = NEW_C_HEAP_ARRAY(char, total_len); | |
454 char* cp_tmp = cp; | |
455 for (i = 0; i < _scp_nitems; ++i) { | |
456 if (_items[i] != NULL) { | |
457 memcpy(cp_tmp, _items[i], lengths[i]); | |
458 cp_tmp += lengths[i]; | |
459 *cp_tmp++ = separator; | |
460 } | |
461 } | |
462 *--cp_tmp = '\0'; // Replace the extra separator. | |
463 return cp; | |
464 } | |
465 | |
466 // Note: path must be c-heap-allocated (or NULL); it is freed if non-null. | |
467 char* | |
468 SysClassPath::add_to_path(const char* path, const char* str, bool prepend) { | |
469 char *cp; | |
470 | |
471 assert(str != NULL, "just checking"); | |
472 if (path == NULL) { | |
473 size_t len = strlen(str) + 1; | |
474 cp = NEW_C_HEAP_ARRAY(char, len); | |
475 memcpy(cp, str, len); // copy the trailing null | |
476 } else { | |
477 const char separator = *os::path_separator(); | |
478 size_t old_len = strlen(path); | |
479 size_t str_len = strlen(str); | |
480 size_t len = old_len + str_len + 2; | |
481 | |
482 if (prepend) { | |
483 cp = NEW_C_HEAP_ARRAY(char, len); | |
484 char* cp_tmp = cp; | |
485 memcpy(cp_tmp, str, str_len); | |
486 cp_tmp += str_len; | |
487 *cp_tmp = separator; | |
488 memcpy(++cp_tmp, path, old_len + 1); // copy the trailing null | |
489 FREE_C_HEAP_ARRAY(char, path); | |
490 } else { | |
491 cp = REALLOC_C_HEAP_ARRAY(char, path, len); | |
492 char* cp_tmp = cp + old_len; | |
493 *cp_tmp = separator; | |
494 memcpy(++cp_tmp, str, str_len + 1); // copy the trailing null | |
495 } | |
496 } | |
497 return cp; | |
498 } | |
499 | |
500 // Scan the directory and append any jar or zip files found to path. | |
501 // Note: path must be c-heap-allocated (or NULL); it is freed if non-null. | |
502 char* SysClassPath::add_jars_to_path(char* path, const char* directory) { | |
503 DIR* dir = os::opendir(directory); | |
504 if (dir == NULL) return path; | |
505 | |
506 char dir_sep[2] = { '\0', '\0' }; | |
507 size_t directory_len = strlen(directory); | |
508 const char fileSep = *os::file_separator(); | |
509 if (directory[directory_len - 1] != fileSep) dir_sep[0] = fileSep; | |
510 | |
511 /* Scan the directory for jars/zips, appending them to path. */ | |
512 struct dirent *entry; | |
513 char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory)); | |
514 while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) { | |
515 const char* name = entry->d_name; | |
516 const char* ext = name + strlen(name) - 4; | |
517 bool isJarOrZip = ext > name && | |
518 (os::file_name_strcmp(ext, ".jar") == 0 || | |
519 os::file_name_strcmp(ext, ".zip") == 0); | |
520 if (isJarOrZip) { | |
521 char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name)); | |
522 sprintf(jarpath, "%s%s%s", directory, dir_sep, name); | |
523 path = add_to_path(path, jarpath, false); | |
524 FREE_C_HEAP_ARRAY(char, jarpath); | |
525 } | |
526 } | |
527 FREE_C_HEAP_ARRAY(char, dbuf); | |
528 os::closedir(dir); | |
529 return path; | |
530 } | |
531 | |
532 // Parses a memory size specification string. | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
533 static bool atomull(const char *s, julong* result) { |
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
534 julong n = 0; |
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
535 int args_read = sscanf(s, os::julong_format_specifier(), &n); |
0 | 536 if (args_read != 1) { |
537 return false; | |
538 } | |
539 while (*s != '\0' && isdigit(*s)) { | |
540 s++; | |
541 } | |
542 // 4705540: illegal if more characters are found after the first non-digit | |
543 if (strlen(s) > 1) { | |
544 return false; | |
545 } | |
546 switch (*s) { | |
547 case 'T': case 't': | |
548 *result = n * G * K; | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
549 // Check for overflow. |
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
550 if (*result/((julong)G * K) != n) return false; |
0 | 551 return true; |
552 case 'G': case 'g': | |
553 *result = n * G; | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
554 if (*result/G != n) return false; |
0 | 555 return true; |
556 case 'M': case 'm': | |
557 *result = n * M; | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
558 if (*result/M != n) return false; |
0 | 559 return true; |
560 case 'K': case 'k': | |
561 *result = n * K; | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
562 if (*result/K != n) return false; |
0 | 563 return true; |
564 case '\0': | |
565 *result = n; | |
566 return true; | |
567 default: | |
568 return false; | |
569 } | |
570 } | |
571 | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
572 Arguments::ArgsRange Arguments::check_memory_size(julong size, julong min_size) { |
0 | 573 if (size < min_size) return arg_too_small; |
574 // Check that size will fit in a size_t (only relevant on 32-bit) | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
575 if (size > max_uintx) return arg_too_big; |
0 | 576 return arg_in_range; |
577 } | |
578 | |
579 // Describe an argument out of range error | |
580 void Arguments::describe_range_error(ArgsRange errcode) { | |
581 switch(errcode) { | |
582 case arg_too_big: | |
583 jio_fprintf(defaultStream::error_stream(), | |
584 "The specified size exceeds the maximum " | |
585 "representable size.\n"); | |
586 break; | |
587 case arg_too_small: | |
588 case arg_unreadable: | |
589 case arg_in_range: | |
590 // do nothing for now | |
591 break; | |
592 default: | |
593 ShouldNotReachHere(); | |
594 } | |
595 } | |
596 | |
597 static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) { | |
598 return CommandLineFlags::boolAtPut(name, &value, origin); | |
599 } | |
600 | |
601 static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) { | |
602 double v; | |
603 if (sscanf(value, "%lf", &v) != 1) { | |
604 return false; | |
605 } | |
606 | |
607 if (CommandLineFlags::doubleAtPut(name, &v, origin)) { | |
608 return true; | |
609 } | |
610 return false; | |
611 } | |
612 | |
613 static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
614 julong v; |
0 | 615 intx intx_v; |
616 bool is_neg = false; | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
617 // Check the sign first since atomull() parses only unsigned values. |
0 | 618 if (*value == '-') { |
619 if (!CommandLineFlags::intxAt(name, &intx_v)) { | |
620 return false; | |
621 } | |
622 value++; | |
623 is_neg = true; | |
624 } | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
625 if (!atomull(value, &v)) { |
0 | 626 return false; |
627 } | |
628 intx_v = (intx) v; | |
629 if (is_neg) { | |
630 intx_v = -intx_v; | |
631 } | |
632 if (CommandLineFlags::intxAtPut(name, &intx_v, origin)) { | |
633 return true; | |
634 } | |
635 uintx uintx_v = (uintx) v; | |
636 if (!is_neg && CommandLineFlags::uintxAtPut(name, &uintx_v, origin)) { | |
637 return true; | |
638 } | |
1064 | 639 uint64_t uint64_t_v = (uint64_t) v; |
640 if (!is_neg && CommandLineFlags::uint64_tAtPut(name, &uint64_t_v, origin)) { | |
641 return true; | |
642 } | |
0 | 643 return false; |
644 } | |
645 | |
646 static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) { | |
647 if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false; | |
648 // Contract: CommandLineFlags always returns a pointer that needs freeing. | |
649 FREE_C_HEAP_ARRAY(char, value); | |
650 return true; | |
651 } | |
652 | |
653 static bool append_to_string_flag(char* name, const char* new_value, FlagValueOrigin origin) { | |
654 const char* old_value = ""; | |
655 if (!CommandLineFlags::ccstrAt(name, &old_value)) return false; | |
656 size_t old_len = old_value != NULL ? strlen(old_value) : 0; | |
657 size_t new_len = strlen(new_value); | |
658 const char* value; | |
659 char* free_this_too = NULL; | |
660 if (old_len == 0) { | |
661 value = new_value; | |
662 } else if (new_len == 0) { | |
663 value = old_value; | |
664 } else { | |
665 char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1); | |
666 // each new setting adds another LINE to the switch: | |
667 sprintf(buf, "%s\n%s", old_value, new_value); | |
668 value = buf; | |
669 free_this_too = buf; | |
670 } | |
671 (void) CommandLineFlags::ccstrAtPut(name, &value, origin); | |
672 // CommandLineFlags always returns a pointer that needs freeing. | |
673 FREE_C_HEAP_ARRAY(char, value); | |
674 if (free_this_too != NULL) { | |
675 // CommandLineFlags made its own copy, so I must delete my own temp. buffer. | |
676 FREE_C_HEAP_ARRAY(char, free_this_too); | |
677 } | |
678 return true; | |
679 } | |
680 | |
681 bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) { | |
682 | |
683 // range of acceptable characters spelled out for portability reasons | |
684 #define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]" | |
685 #define BUFLEN 255 | |
686 char name[BUFLEN+1]; | |
687 char dummy; | |
688 | |
689 if (sscanf(arg, "-%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) { | |
690 return set_bool_flag(name, false, origin); | |
691 } | |
692 if (sscanf(arg, "+%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) { | |
693 return set_bool_flag(name, true, origin); | |
694 } | |
695 | |
696 char punct; | |
697 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "%c", name, &punct) == 2 && punct == '=') { | |
698 const char* value = strchr(arg, '=') + 1; | |
699 Flag* flag = Flag::find_flag(name, strlen(name)); | |
700 if (flag != NULL && flag->is_ccstr()) { | |
701 if (flag->ccstr_accumulates()) { | |
702 return append_to_string_flag(name, value, origin); | |
703 } else { | |
704 if (value[0] == '\0') { | |
705 value = NULL; | |
706 } | |
707 return set_string_flag(name, value, origin); | |
708 } | |
709 } | |
710 } | |
711 | |
712 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE ":%c", name, &punct) == 2 && punct == '=') { | |
713 const char* value = strchr(arg, '=') + 1; | |
714 // -XX:Foo:=xxx will reset the string flag to the given value. | |
715 if (value[0] == '\0') { | |
716 value = NULL; | |
717 } | |
718 return set_string_flag(name, value, origin); | |
719 } | |
720 | |
721 #define SIGNED_FP_NUMBER_RANGE "[-0123456789.]" | |
722 #define SIGNED_NUMBER_RANGE "[-0123456789]" | |
723 #define NUMBER_RANGE "[0123456789]" | |
724 char value[BUFLEN + 1]; | |
725 char value2[BUFLEN + 1]; | |
726 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_NUMBER_RANGE "." "%" XSTR(BUFLEN) NUMBER_RANGE "%c", name, value, value2, &dummy) == 3) { | |
727 // Looks like a floating-point number -- try again with more lenient format string | |
728 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_FP_NUMBER_RANGE "%c", name, value, &dummy) == 2) { | |
729 return set_fp_numeric_flag(name, value, origin); | |
730 } | |
731 } | |
732 | |
733 #define VALUE_RANGE "[-kmgtKMGT0123456789]" | |
734 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) VALUE_RANGE "%c", name, value, &dummy) == 2) { | |
735 return set_numeric_flag(name, value, origin); | |
736 } | |
737 | |
738 return false; | |
739 } | |
740 | |
741 void Arguments::add_string(char*** bldarray, int* count, const char* arg) { | |
742 assert(bldarray != NULL, "illegal argument"); | |
743 | |
744 if (arg == NULL) { | |
745 return; | |
746 } | |
747 | |
748 int index = *count; | |
749 | |
750 // expand the array and add arg to the last element | |
751 (*count)++; | |
752 if (*bldarray == NULL) { | |
753 *bldarray = NEW_C_HEAP_ARRAY(char*, *count); | |
754 } else { | |
755 *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count); | |
756 } | |
757 (*bldarray)[index] = strdup(arg); | |
758 } | |
759 | |
760 void Arguments::build_jvm_args(const char* arg) { | |
761 add_string(&_jvm_args_array, &_num_jvm_args, arg); | |
762 } | |
763 | |
764 void Arguments::build_jvm_flags(const char* arg) { | |
765 add_string(&_jvm_flags_array, &_num_jvm_flags, arg); | |
766 } | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
767 #ifdef GRAAL |
2891
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
768 void Arguments::add_graal_arg(const char* arg) { |
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
769 add_string(&_graal_args_array, &_num_graal_args, arg); |
1437
9e5e83ca2259
Enabled -C1X:OPTIONS when running HotSpot/C1X. Enabled checkstyle for the HotSpotVM Java project.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
1356
diff
changeset
|
770 } |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
771 #endif |
1437
9e5e83ca2259
Enabled -C1X:OPTIONS when running HotSpot/C1X. Enabled checkstyle for the HotSpotVM Java project.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
1356
diff
changeset
|
772 |
0 | 773 // utility function to return a string that concatenates all |
774 // strings in a given char** array | |
775 const char* Arguments::build_resource_string(char** args, int count) { | |
776 if (args == NULL || count == 0) { | |
777 return NULL; | |
778 } | |
779 size_t length = strlen(args[0]) + 1; // add 1 for the null terminator | |
780 for (int i = 1; i < count; i++) { | |
781 length += strlen(args[i]) + 1; // add 1 for a space | |
782 } | |
783 char* s = NEW_RESOURCE_ARRAY(char, length); | |
784 strcpy(s, args[0]); | |
785 for (int j = 1; j < count; j++) { | |
786 strcat(s, " "); | |
787 strcat(s, args[j]); | |
788 } | |
789 return (const char*) s; | |
790 } | |
791 | |
792 void Arguments::print_on(outputStream* st) { | |
793 st->print_cr("VM Arguments:"); | |
794 if (num_jvm_flags() > 0) { | |
795 st->print("jvm_flags: "); print_jvm_flags_on(st); | |
796 } | |
797 if (num_jvm_args() > 0) { | |
798 st->print("jvm_args: "); print_jvm_args_on(st); | |
799 } | |
800 st->print_cr("java_command: %s", java_command() ? java_command() : "<unknown>"); | |
801 st->print_cr("Launcher Type: %s", _sun_java_launcher); | |
802 } | |
803 | |
804 void Arguments::print_jvm_flags_on(outputStream* st) { | |
805 if (_num_jvm_flags > 0) { | |
806 for (int i=0; i < _num_jvm_flags; i++) { | |
807 st->print("%s ", _jvm_flags_array[i]); | |
808 } | |
809 st->print_cr(""); | |
810 } | |
811 } | |
812 | |
813 void Arguments::print_jvm_args_on(outputStream* st) { | |
814 if (_num_jvm_args > 0) { | |
815 for (int i=0; i < _num_jvm_args; i++) { | |
816 st->print("%s ", _jvm_args_array[i]); | |
817 } | |
818 st->print_cr(""); | |
819 } | |
820 } | |
821 | |
242 | 822 bool Arguments::process_argument(const char* arg, |
823 jboolean ignore_unrecognized, FlagValueOrigin origin) { | |
824 | |
825 JDK_Version since = JDK_Version(); | |
0 | 826 |
3250 | 827 if (parse_argument(arg, origin) || ignore_unrecognized) { |
828 return true; | |
0 | 829 } |
3250 | 830 |
831 const char * const argname = *arg == '+' || *arg == '-' ? arg + 1 : arg; | |
832 if (is_newly_obsolete(arg, &since)) { | |
833 char version[256]; | |
834 since.to_string(version, sizeof(version)); | |
835 warning("ignoring option %s; support was removed in %s", argname, version); | |
836 return true; | |
837 } | |
838 | |
839 jio_fprintf(defaultStream::error_stream(), | |
840 "Unrecognized VM option '%s'\n", argname); | |
841 // allow for commandline "commenting out" options like -XX:#+Verbose | |
842 return arg[0] == '#'; | |
0 | 843 } |
844 | |
845 bool Arguments::process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized) { | |
846 FILE* stream = fopen(file_name, "rb"); | |
847 if (stream == NULL) { | |
848 if (should_exist) { | |
849 jio_fprintf(defaultStream::error_stream(), | |
850 "Could not open settings file %s\n", file_name); | |
851 return false; | |
852 } else { | |
853 return true; | |
854 } | |
855 } | |
856 | |
857 char token[1024]; | |
858 int pos = 0; | |
859 | |
860 bool in_white_space = true; | |
861 bool in_comment = false; | |
862 bool in_quote = false; | |
863 char quote_c = 0; | |
864 bool result = true; | |
865 | |
866 int c = getc(stream); | |
867 while(c != EOF) { | |
868 if (in_white_space) { | |
869 if (in_comment) { | |
870 if (c == '\n') in_comment = false; | |
871 } else { | |
872 if (c == '#') in_comment = true; | |
873 else if (!isspace(c)) { | |
874 in_white_space = false; | |
875 token[pos++] = c; | |
876 } | |
877 } | |
878 } else { | |
879 if (c == '\n' || (!in_quote && isspace(c))) { | |
880 // token ends at newline, or at unquoted whitespace | |
881 // this allows a way to include spaces in string-valued options | |
882 token[pos] = '\0'; | |
883 logOption(token); | |
884 result &= process_argument(token, ignore_unrecognized, CONFIG_FILE); | |
885 build_jvm_flags(token); | |
886 pos = 0; | |
887 in_white_space = true; | |
888 in_quote = false; | |
889 } else if (!in_quote && (c == '\'' || c == '"')) { | |
890 in_quote = true; | |
891 quote_c = c; | |
892 } else if (in_quote && (c == quote_c)) { | |
893 in_quote = false; | |
894 } else { | |
895 token[pos++] = c; | |
896 } | |
897 } | |
898 c = getc(stream); | |
899 } | |
900 if (pos > 0) { | |
901 token[pos] = '\0'; | |
902 result &= process_argument(token, ignore_unrecognized, CONFIG_FILE); | |
903 build_jvm_flags(token); | |
904 } | |
905 fclose(stream); | |
906 return result; | |
907 } | |
908 | |
909 //============================================================================================================= | |
910 // Parsing of properties (-D) | |
911 | |
912 const char* Arguments::get_property(const char* key) { | |
913 return PropertyList_get_value(system_properties(), key); | |
914 } | |
915 | |
916 bool Arguments::add_property(const char* prop) { | |
917 const char* eq = strchr(prop, '='); | |
918 char* key; | |
919 // ns must be static--its address may be stored in a SystemProperty object. | |
920 const static char ns[1] = {0}; | |
921 char* value = (char *)ns; | |
922 | |
923 size_t key_len = (eq == NULL) ? strlen(prop) : (eq - prop); | |
924 key = AllocateHeap(key_len + 1, "add_property"); | |
925 strncpy(key, prop, key_len); | |
926 key[key_len] = '\0'; | |
927 | |
928 if (eq != NULL) { | |
929 size_t value_len = strlen(prop) - key_len - 1; | |
930 value = AllocateHeap(value_len + 1, "add_property"); | |
931 strncpy(value, &prop[key_len + 1], value_len + 1); | |
932 } | |
933 | |
934 if (strcmp(key, "java.compiler") == 0) { | |
935 process_java_compiler_argument(value); | |
936 FreeHeap(key); | |
937 if (eq != NULL) { | |
938 FreeHeap(value); | |
939 } | |
940 return true; | |
691 | 941 } else if (strcmp(key, "sun.java.command") == 0) { |
0 | 942 _java_command = value; |
943 | |
2129
8f8dfba37802
6994753: Implement optional hook to a Java method at VM startup.
kevinw
parents:
2095
diff
changeset
|
944 // Record value in Arguments, but let it get passed to Java. |
691 | 945 } else if (strcmp(key, "sun.java.launcher.pid") == 0) { |
0 | 946 // launcher.pid property is private and is processed |
947 // in process_sun_java_launcher_properties(); | |
948 // the sun.java.launcher property is passed on to the java application | |
949 FreeHeap(key); | |
950 if (eq != NULL) { | |
951 FreeHeap(value); | |
952 } | |
953 return true; | |
691 | 954 } else if (strcmp(key, "java.vendor.url.bug") == 0) { |
0 | 955 // save it in _java_vendor_url_bug, so JVM fatal error handler can access |
956 // its value without going through the property list or making a Java call. | |
957 _java_vendor_url_bug = value; | |
691 | 958 } else if (strcmp(key, "sun.boot.library.path") == 0) { |
959 PropertyList_unique_add(&_system_properties, key, value, true); | |
960 return true; | |
0 | 961 } |
962 // Create new property and add at the end of the list | |
963 PropertyList_unique_add(&_system_properties, key, value); | |
964 return true; | |
965 } | |
966 | |
967 //=========================================================================================================== | |
968 // Setting int/mixed/comp mode flags | |
969 | |
970 void Arguments::set_mode_flags(Mode mode) { | |
971 // Set up default values for all flags. | |
972 // If you add a flag to any of the branches below, | |
973 // add a default value for it here. | |
974 set_java_compiler(false); | |
975 _mode = mode; | |
976 | |
977 // Ensure Agent_OnLoad has the correct initial values. | |
978 // This may not be the final mode; mode may change later in onload phase. | |
979 PropertyList_unique_add(&_system_properties, "java.vm.info", | |
3326
6c978a541c03
7036267: c2/arm: mark version number as experimental and disable on unsupported platforms
dholmes
parents:
3261
diff
changeset
|
980 (char*)VM_Version::vm_info_string(), false); |
0 | 981 |
982 UseInterpreter = true; | |
983 UseCompiler = true; | |
984 UseLoopCounter = true; | |
985 | |
2458
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
986 #ifndef ZERO |
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
987 // Turn these off for mixed and comp. Leave them on for Zero. |
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
988 if (FLAG_IS_DEFAULT(UseFastAccessorMethods)) { |
3341
e9b8ef09622a
7041582: set_mode_flags isn't called without -Xmixed specified
never
parents:
3261
diff
changeset
|
989 UseFastAccessorMethods = (mode == _int); |
2458
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
990 } |
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
991 if (FLAG_IS_DEFAULT(UseFastEmptyMethods)) { |
3341
e9b8ef09622a
7041582: set_mode_flags isn't called without -Xmixed specified
never
parents:
3261
diff
changeset
|
992 UseFastEmptyMethods = (mode == _int); |
2458
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
993 } |
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
994 #endif |
98c560260039
7034513: enable fast accessors and empty methods for ZERO and -Xint
never
parents:
2416
diff
changeset
|
995 |
0 | 996 // Default values may be platform/compiler dependent - |
997 // use the saved values | |
998 ClipInlining = Arguments::_ClipInlining; | |
999 AlwaysCompileLoopMethods = Arguments::_AlwaysCompileLoopMethods; | |
1000 UseOnStackReplacement = Arguments::_UseOnStackReplacement; | |
1001 BackgroundCompilation = Arguments::_BackgroundCompilation; | |
1002 | |
1003 // Change from defaults based on mode | |
1004 switch (mode) { | |
1005 default: | |
1006 ShouldNotReachHere(); | |
1007 break; | |
1008 case _int: | |
1009 UseCompiler = false; | |
1010 UseLoopCounter = false; | |
1011 AlwaysCompileLoopMethods = false; | |
1012 UseOnStackReplacement = false; | |
1013 break; | |
1014 case _mixed: | |
1015 // same as default | |
1016 break; | |
1017 case _comp: | |
1018 UseInterpreter = false; | |
1019 BackgroundCompilation = false; | |
1020 ClipInlining = false; | |
1021 break; | |
1022 } | |
1023 } | |
1024 | |
1025 // Conflict: required to use shared spaces (-Xshare:on), but | |
1026 // incompatible command line options were chosen. | |
1027 | |
1028 static void no_shared_spaces() { | |
1029 if (RequireSharedSpaces) { | |
1030 jio_fprintf(defaultStream::error_stream(), | |
1031 "Class data sharing is inconsistent with other specified options.\n"); | |
1032 vm_exit_during_initialization("Unable to use shared archive.", NULL); | |
1033 } else { | |
1034 FLAG_SET_DEFAULT(UseSharedSpaces, false); | |
1035 } | |
1036 } | |
1037 | |
1783 | 1038 void Arguments::set_tiered_flags() { |
2348
5d8f5a6dced7
7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents:
2325
diff
changeset
|
1039 // With tiered, set default policy to AdvancedThresholdPolicy, which is 3. |
1783 | 1040 if (FLAG_IS_DEFAULT(CompilationPolicyChoice)) { |
2348
5d8f5a6dced7
7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents:
2325
diff
changeset
|
1041 FLAG_SET_DEFAULT(CompilationPolicyChoice, 3); |
1783 | 1042 } |
1043 if (CompilationPolicyChoice < 2) { | |
1044 vm_exit_during_initialization( | |
1045 "Incompatible compilation policy selected", NULL); | |
1046 } | |
1891
9de67bf4244d
6996136: VM crash in src/share/vm/runtime/virtualspace.cpp:424
iveresov
parents:
1890
diff
changeset
|
1047 // Increase the code cache size - tiered compiles a lot more. |
1783 | 1048 if (FLAG_IS_DEFAULT(ReservedCodeCacheSize)) { |
1049 FLAG_SET_DEFAULT(ReservedCodeCacheSize, ReservedCodeCacheSize * 2); | |
1050 } | |
1051 } | |
1052 | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1053 #ifndef KERNEL |
0 | 1054 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC |
1055 // if it's not explictly set or unset. If the user has chosen | |
1056 // UseParNewGC and not explicitly set ParallelGCThreads we | |
1057 // set it, unless this is a single cpu machine. | |
1058 void Arguments::set_parnew_gc_flags() { | |
1064 | 1059 assert(!UseSerialGC && !UseParallelOldGC && !UseParallelGC && !UseG1GC, |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1060 "control point invariant"); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1061 assert(UseParNewGC, "Error"); |
0 | 1062 |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1063 // Turn off AdaptiveSizePolicy by default for parnew until it is |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1064 // complete. |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1065 if (FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) { |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1066 FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1067 } |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1068 |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1069 if (ParallelGCThreads == 0) { |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1070 FLAG_SET_DEFAULT(ParallelGCThreads, |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1071 Abstract_VM_Version::parallel_worker_threads()); |
1064 | 1072 if (ParallelGCThreads == 1) { |
0 | 1073 FLAG_SET_DEFAULT(UseParNewGC, false); |
1064 | 1074 FLAG_SET_DEFAULT(ParallelGCThreads, 0); |
0 | 1075 } |
1076 } | |
1064 | 1077 if (UseParNewGC) { |
1078 // CDS doesn't work with ParNew yet | |
0 | 1079 no_shared_spaces(); |
1080 | |
695 | 1081 // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 respectively, |
0 | 1082 // these settings are default for Parallel Scavenger. For ParNew+Tenured configuration |
1083 // we set them to 1024 and 1024. | |
1084 // See CR 6362902. | |
1085 if (FLAG_IS_DEFAULT(YoungPLABSize)) { | |
1086 FLAG_SET_DEFAULT(YoungPLABSize, (intx)1024); | |
1087 } | |
1088 if (FLAG_IS_DEFAULT(OldPLABSize)) { | |
1089 FLAG_SET_DEFAULT(OldPLABSize, (intx)1024); | |
1090 } | |
1091 | |
1064 | 1092 // AlwaysTenure flag should make ParNew promote all at first collection. |
0 | 1093 // See CR 6362902. |
1094 if (AlwaysTenure) { | |
1095 FLAG_SET_CMDLINE(intx, MaxTenuringThreshold, 0); | |
1096 } | |
695 | 1097 // When using compressed oops, we use local overflow stacks, |
1098 // rather than using a global overflow list chained through | |
1099 // the klass word of the object's pre-image. | |
1100 if (UseCompressedOops && !ParGCUseLocalOverflow) { | |
1101 if (!FLAG_IS_DEFAULT(ParGCUseLocalOverflow)) { | |
1102 warning("Forcing +ParGCUseLocalOverflow: needed if using compressed references"); | |
1103 } | |
1104 FLAG_SET_DEFAULT(ParGCUseLocalOverflow, true); | |
1105 } | |
1106 assert(ParGCUseLocalOverflow || !UseCompressedOops, "Error"); | |
0 | 1107 } |
1108 } | |
1109 | |
1110 // Adjust some sizes to suit CMS and/or ParNew needs; these work well on | |
1111 // sparc/solaris for certain applications, but would gain from | |
1112 // further optimization and tuning efforts, and would almost | |
1113 // certainly gain from analysis of platform and environment. | |
1114 void Arguments::set_cms_and_parnew_gc_flags() { | |
1064 | 1115 assert(!UseSerialGC && !UseParallelOldGC && !UseParallelGC, "Error"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1116 assert(UseConcMarkSweepGC, "CMS is expected to be on here"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1117 |
0 | 1118 // If we are using CMS, we prefer to UseParNewGC, |
1119 // unless explicitly forbidden. | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1120 if (FLAG_IS_DEFAULT(UseParNewGC)) { |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1121 FLAG_SET_ERGO(bool, UseParNewGC, true); |
0 | 1122 } |
1123 | |
1124 // Turn off AdaptiveSizePolicy by default for cms until it is | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1125 // complete. |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1126 if (FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) { |
0 | 1127 FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false); |
1128 } | |
1129 | |
1130 // In either case, adjust ParallelGCThreads and/or UseParNewGC | |
1131 // as needed. | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1132 if (UseParNewGC) { |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1133 set_parnew_gc_flags(); |
0 | 1134 } |
1135 | |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1136 // MaxHeapSize is aligned down in collectorPolicy |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1137 size_t max_heap = align_size_down(MaxHeapSize, |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1138 CardTableRS::ct_max_alignment_constraint()); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1139 |
0 | 1140 // Now make adjustments for CMS |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1141 intx tenuring_default = (intx)6; |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1142 size_t young_gen_per_worker = CMSYoungGenPerWorker; |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1143 |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1144 // Preferred young gen size for "short" pauses: |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1145 // upper bound depends on # of threads and NewRatio. |
0 | 1146 const uintx parallel_gc_threads = |
1147 (ParallelGCThreads == 0 ? 1 : ParallelGCThreads); | |
1148 const size_t preferred_max_new_size_unaligned = | |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1149 MIN2(max_heap/(NewRatio+1), ScaleForWordSize(young_gen_per_worker * parallel_gc_threads)); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1150 size_t preferred_max_new_size = |
0 | 1151 align_size_up(preferred_max_new_size_unaligned, os::vm_page_size()); |
1152 | |
1153 // Unless explicitly requested otherwise, size young gen | |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1154 // for "short" pauses ~ CMSYoungGenPerWorker*ParallelGCThreads |
886
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1155 |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1156 // If either MaxNewSize or NewRatio is set on the command line, |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1157 // assume the user is trying to set the size of the young gen. |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1158 if (FLAG_IS_DEFAULT(MaxNewSize) && FLAG_IS_DEFAULT(NewRatio)) { |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1159 |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1160 // Set MaxNewSize to our calculated preferred_max_new_size unless |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1161 // NewSize was set on the command line and it is larger than |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1162 // preferred_max_new_size. |
0 | 1163 if (!FLAG_IS_DEFAULT(NewSize)) { // NewSize explicitly set at command-line |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1164 FLAG_SET_ERGO(uintx, MaxNewSize, MAX2(NewSize, preferred_max_new_size)); |
0 | 1165 } else { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1166 FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size); |
0 | 1167 } |
1064 | 1168 if (PrintGCDetails && Verbose) { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1169 // Too early to use gclog_or_tty |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1170 tty->print_cr("CMS ergo set MaxNewSize: " SIZE_FORMAT, MaxNewSize); |
886
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1171 } |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1172 |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1173 // Code along this path potentially sets NewSize and OldSize |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1174 |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1175 assert(max_heap >= InitialHeapSize, "Error"); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1176 assert(max_heap >= NewSize, "Error"); |
0 | 1177 |
1064 | 1178 if (PrintGCDetails && Verbose) { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1179 // Too early to use gclog_or_tty |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1180 tty->print_cr("CMS set min_heap_size: " SIZE_FORMAT |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1181 " initial_heap_size: " SIZE_FORMAT |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1182 " max_heap: " SIZE_FORMAT, |
1064 | 1183 min_heap_size(), InitialHeapSize, max_heap); |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1184 } |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1185 size_t min_new = preferred_max_new_size; |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1186 if (FLAG_IS_CMDLINE(NewSize)) { |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1187 min_new = NewSize; |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1188 } |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1189 if (max_heap > min_new && min_heap_size() > min_new) { |
0 | 1190 // Unless explicitly requested otherwise, make young gen |
1191 // at least min_new, and at most preferred_max_new_size. | |
1192 if (FLAG_IS_DEFAULT(NewSize)) { | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1193 FLAG_SET_ERGO(uintx, NewSize, MAX2(NewSize, min_new)); |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1194 FLAG_SET_ERGO(uintx, NewSize, MIN2(preferred_max_new_size, NewSize)); |
1064 | 1195 if (PrintGCDetails && Verbose) { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1196 // Too early to use gclog_or_tty |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1197 tty->print_cr("CMS ergo set NewSize: " SIZE_FORMAT, NewSize); |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1198 } |
0 | 1199 } |
1200 // Unless explicitly requested otherwise, size old gen | |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1201 // so it's NewRatio x of NewSize. |
0 | 1202 if (FLAG_IS_DEFAULT(OldSize)) { |
1203 if (max_heap > NewSize) { | |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1204 FLAG_SET_ERGO(uintx, OldSize, MIN2(NewRatio*NewSize, max_heap - NewSize)); |
1064 | 1205 if (PrintGCDetails && Verbose) { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1206 // Too early to use gclog_or_tty |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
1207 tty->print_cr("CMS ergo set OldSize: " SIZE_FORMAT, OldSize); |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1208 } |
0 | 1209 } |
1210 } | |
1211 } | |
1212 } | |
1213 // Unless explicitly requested otherwise, definitely | |
1214 // promote all objects surviving "tenuring_default" scavenges. | |
1215 if (FLAG_IS_DEFAULT(MaxTenuringThreshold) && | |
1216 FLAG_IS_DEFAULT(SurvivorRatio)) { | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1217 FLAG_SET_ERGO(intx, MaxTenuringThreshold, tenuring_default); |
0 | 1218 } |
1219 // If we decided above (or user explicitly requested) | |
1220 // `promote all' (via MaxTenuringThreshold := 0), | |
1221 // prefer minuscule survivor spaces so as not to waste | |
1222 // space for (non-existent) survivors | |
1223 if (FLAG_IS_DEFAULT(SurvivorRatio) && MaxTenuringThreshold == 0) { | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1224 FLAG_SET_ERGO(intx, SurvivorRatio, MAX2((intx)1024, SurvivorRatio)); |
0 | 1225 } |
1226 // If OldPLABSize is set and CMSParPromoteBlocksToClaim is not, | |
1227 // set CMSParPromoteBlocksToClaim equal to OldPLABSize. | |
1228 // This is done in order to make ParNew+CMS configuration to work | |
1229 // with YoungPLABSize and OldPLABSize options. | |
1230 // See CR 6362902. | |
1231 if (!FLAG_IS_DEFAULT(OldPLABSize)) { | |
1232 if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) { | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1233 // OldPLABSize is not the default value but CMSParPromoteBlocksToClaim |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1234 // is. In this situtation let CMSParPromoteBlocksToClaim follow |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1235 // the value (either from the command line or ergonomics) of |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1236 // OldPLABSize. Following OldPLABSize is an ergonomics decision. |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1237 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize); |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1238 } else { |
0 | 1239 // OldPLABSize and CMSParPromoteBlocksToClaim are both set. |
1240 // CMSParPromoteBlocksToClaim is a collector-specific flag, so | |
1241 // we'll let it to take precedence. | |
1242 jio_fprintf(defaultStream::error_stream(), | |
886
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1243 "Both OldPLABSize and CMSParPromoteBlocksToClaim" |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1244 " options are specified for the CMS collector." |
061cd4d965fc
6862534: -XX:NewRatio completely ignored when combined with -XX:+UseConcMarkSweepG
jmasa
parents:
845
diff
changeset
|
1245 " CMSParPromoteBlocksToClaim will take precedence.\n"); |
0 | 1246 } |
1247 } | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1248 if (!FLAG_IS_DEFAULT(ResizeOldPLAB) && !ResizeOldPLAB) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1249 // OldPLAB sizing manually turned off: Use a larger default setting, |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1250 // unless it was manually specified. This is because a too-low value |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1251 // will slow down scavenges. |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1252 if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1253 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, 50); // default value before 6631166 |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1254 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1255 } |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1256 // Overwrite OldPLABSize which is the variable we will internally use everywhere. |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1257 FLAG_SET_ERGO(uintx, OldPLABSize, CMSParPromoteBlocksToClaim); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1258 // If either of the static initialization defaults have changed, note this |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1259 // modification. |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1260 if (!FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim) || !FLAG_IS_DEFAULT(OldPLABWeight)) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1261 CFLS_LAB::modify_initialization(OldPLABSize, OldPLABWeight); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1262 } |
1284 | 1263 if (PrintGCDetails && Verbose) { |
1264 tty->print_cr("MarkStackSize: %uk MarkStackSizeMax: %uk", | |
1265 MarkStackSize / K, MarkStackSizeMax / K); | |
1266 tty->print_cr("ConcGCThreads: %u", ConcGCThreads); | |
1267 } | |
0 | 1268 } |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
1269 #endif // KERNEL |
0 | 1270 |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1271 void set_object_alignment() { |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1272 // Object alignment. |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1273 assert(is_power_of_2(ObjectAlignmentInBytes), "ObjectAlignmentInBytes must be power of 2"); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1274 MinObjAlignmentInBytes = ObjectAlignmentInBytes; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1275 assert(MinObjAlignmentInBytes >= HeapWordsPerLong * HeapWordSize, "ObjectAlignmentInBytes value is too small"); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1276 MinObjAlignment = MinObjAlignmentInBytes / HeapWordSize; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1277 assert(MinObjAlignmentInBytes == MinObjAlignment * HeapWordSize, "ObjectAlignmentInBytes value is incorrect"); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1278 MinObjAlignmentInBytesMask = MinObjAlignmentInBytes - 1; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1279 |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1280 LogMinObjAlignmentInBytes = exact_log2(ObjectAlignmentInBytes); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1281 LogMinObjAlignment = LogMinObjAlignmentInBytes - LogHeapWordSize; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1282 |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1283 // Oop encoding heap max |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1284 OopEncodingHeapMax = (uint64_t(max_juint) + 1) << LogMinObjAlignmentInBytes; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1285 |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1286 #ifndef KERNEL |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1287 // Set CMS global values |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1288 CompactibleFreeListSpace::set_cms_values(); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1289 #endif // KERNEL |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1290 } |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1291 |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1292 bool verify_object_alignment() { |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1293 // Object alignment. |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1294 if (!is_power_of_2(ObjectAlignmentInBytes)) { |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1295 jio_fprintf(defaultStream::error_stream(), |
1829
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1296 "error: ObjectAlignmentInBytes=%d must be power of 2\n", |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1297 (int)ObjectAlignmentInBytes); |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1298 return false; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1299 } |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1300 if ((int)ObjectAlignmentInBytes < BytesPerLong) { |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1301 jio_fprintf(defaultStream::error_stream(), |
1829
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1302 "error: ObjectAlignmentInBytes=%d must be greater or equal %d\n", |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1303 (int)ObjectAlignmentInBytes, BytesPerLong); |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1304 return false; |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1305 } |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1306 // It does not make sense to have big object alignment |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1307 // since a space lost due to alignment will be greater |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1308 // then a saved space from compressed oops. |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1309 if ((int)ObjectAlignmentInBytes > 256) { |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1310 jio_fprintf(defaultStream::error_stream(), |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1311 "error: ObjectAlignmentInBytes=%d must not be greater then 256\n", |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1312 (int)ObjectAlignmentInBytes); |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1313 return false; |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1314 } |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1315 // In case page size is very small. |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1316 if ((int)ObjectAlignmentInBytes >= os::vm_page_size()) { |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1317 jio_fprintf(defaultStream::error_stream(), |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1318 "error: ObjectAlignmentInBytes=%d must be less then page size %d\n", |
fe08403130db
6979458: VM crashes when -XX:ObjectAlignmentInBytes is too big
kvn
parents:
1796
diff
changeset
|
1319 (int)ObjectAlignmentInBytes, os::vm_page_size()); |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1320 return false; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1321 } |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1322 return true; |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1323 } |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1324 |
135
b7268662a986
6689523: max heap calculation for compressed oops is off by MaxPermSize
coleenp
parents:
113
diff
changeset
|
1325 inline uintx max_heap_for_compressed_oops() { |
1963 | 1326 // Avoid sign flip. |
1327 if (OopEncodingHeapMax < MaxPermSize + os::vm_page_size()) { | |
1328 return 0; | |
1329 } | |
1330 LP64_ONLY(return OopEncodingHeapMax - MaxPermSize - os::vm_page_size()); | |
1064 | 1331 NOT_LP64(ShouldNotReachHere(); return 0); |
135
b7268662a986
6689523: max heap calculation for compressed oops is off by MaxPermSize
coleenp
parents:
113
diff
changeset
|
1332 } |
b7268662a986
6689523: max heap calculation for compressed oops is off by MaxPermSize
coleenp
parents:
113
diff
changeset
|
1333 |
0 | 1334 bool Arguments::should_auto_select_low_pause_collector() { |
1335 if (UseAutoGCSelectPolicy && | |
1336 !FLAG_IS_DEFAULT(MaxGCPauseMillis) && | |
1337 (MaxGCPauseMillis <= AutoGCSelectPauseMillis)) { | |
1338 if (PrintGCDetails) { | |
1339 // Cannot use gclog_or_tty yet. | |
1340 tty->print_cr("Automatic selection of the low pause collector" | |
1341 " based on pause goal of %d (ms)", MaxGCPauseMillis); | |
1342 } | |
1343 return true; | |
1344 } | |
1345 return false; | |
1346 } | |
1347 | |
1348 void Arguments::set_ergonomics_flags() { | |
1349 // Parallel GC is not compatible with sharing. If one specifies | |
1064 | 1350 // that they want sharing explicitly, do not set ergonomics flags. |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
1351 if (DumpSharedSpaces || RequireSharedSpaces) { |
0 | 1352 return; |
1353 } | |
1354 | |
1355 if (os::is_server_class_machine() && !force_client_mode ) { | |
1356 // If no other collector is requested explicitly, | |
1357 // let the VM select the collector based on | |
1358 // machine class and automatic selection policy. | |
1359 if (!UseSerialGC && | |
1360 !UseConcMarkSweepGC && | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1361 !UseG1GC && |
0 | 1362 !UseParNewGC && |
1363 !DumpSharedSpaces && | |
1364 FLAG_IS_DEFAULT(UseParallelGC)) { | |
1365 if (should_auto_select_low_pause_collector()) { | |
1366 FLAG_SET_ERGO(bool, UseConcMarkSweepGC, true); | |
1367 } else { | |
1368 FLAG_SET_ERGO(bool, UseParallelGC, true); | |
1369 } | |
1370 no_shared_spaces(); | |
1371 } | |
1372 } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1373 |
1010 | 1374 #ifndef ZERO |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1375 #ifdef _LP64 |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1376 // Check that UseCompressedOops can be set with the max heap size allocated |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1377 // by ergonomics. |
187 | 1378 if (MaxHeapSize <= max_heap_for_compressed_oops()) { |
1783 | 1379 #if !defined(COMPILER1) || defined(TIERED) |
4111
55d777c0860a
7118648: disable compressed oops by default on MacOS X until 7118647 is fixed
dcubed
parents:
4095
diff
changeset
|
1380 // disable UseCompressedOops by default on MacOS X until 7118647 is fixed |
55d777c0860a
7118648: disable compressed oops by default on MacOS X until 7118647 is fixed
dcubed
parents:
4095
diff
changeset
|
1381 #ifndef __APPLE__ |
2228 | 1382 if (FLAG_IS_DEFAULT(UseCompressedOops)) { |
932 | 1383 FLAG_SET_ERGO(bool, UseCompressedOops, true); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1384 } |
4111
55d777c0860a
7118648: disable compressed oops by default on MacOS X until 7118647 is fixed
dcubed
parents:
4095
diff
changeset
|
1385 #endif // !__APPLE__ |
1060 | 1386 #endif |
325
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1387 #ifdef _WIN64 |
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1388 if (UseLargePages && UseCompressedOops) { |
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1389 // Cannot allocate guard pages for implicit checks in indexed addressing |
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1390 // mode, when large pages are specified on windows. |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
570
diff
changeset
|
1391 // This flag could be switched ON if narrow oop base address is set to 0, |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
570
diff
changeset
|
1392 // see code in Universe::initialize_heap(). |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
570
diff
changeset
|
1393 Universe::set_narrow_oop_use_implicit_null_checks(false); |
325
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1394 } |
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
276
diff
changeset
|
1395 #endif // _WIN64 |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1396 } else { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1397 if (UseCompressedOops && !FLAG_IS_DEFAULT(UseCompressedOops)) { |
344 | 1398 warning("Max heap size too large for Compressed Oops"); |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1399 FLAG_SET_DEFAULT(UseCompressedOops, false); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1400 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1401 } |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1402 // Also checks that certain machines are slower with compressed oops |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1403 // in vm_version initialization code. |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
76
diff
changeset
|
1404 #endif // _LP64 |
1010 | 1405 #endif // !ZERO |
0 | 1406 } |
1407 | |
1408 void Arguments::set_parallel_gc_flags() { | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1409 assert(UseParallelGC || UseParallelOldGC, "Error"); |
0 | 1410 // If parallel old was requested, automatically enable parallel scavenge. |
1411 if (UseParallelOldGC && !UseParallelGC && FLAG_IS_DEFAULT(UseParallelGC)) { | |
1412 FLAG_SET_DEFAULT(UseParallelGC, true); | |
1413 } | |
1414 | |
1415 // If no heap maximum was requested explicitly, use some reasonable fraction | |
1416 // of the physical memory, up to a maximum of 1GB. | |
1417 if (UseParallelGC) { | |
4095
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4039
diff
changeset
|
1418 FLAG_SET_DEFAULT(ParallelGCThreads, |
bca17e38de00
6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents:
4039
diff
changeset
|
1419 Abstract_VM_Version::parallel_worker_threads()); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1420 |
0 | 1421 // If InitialSurvivorRatio or MinSurvivorRatio were not specified, but the |
1422 // SurvivorRatio has been set, reset their default values to SurvivorRatio + | |
1423 // 2. By doing this we make SurvivorRatio also work for Parallel Scavenger. | |
1424 // See CR 6362902 for details. | |
1425 if (!FLAG_IS_DEFAULT(SurvivorRatio)) { | |
1426 if (FLAG_IS_DEFAULT(InitialSurvivorRatio)) { | |
1427 FLAG_SET_DEFAULT(InitialSurvivorRatio, SurvivorRatio + 2); | |
1428 } | |
1429 if (FLAG_IS_DEFAULT(MinSurvivorRatio)) { | |
1430 FLAG_SET_DEFAULT(MinSurvivorRatio, SurvivorRatio + 2); | |
1431 } | |
1432 } | |
1433 | |
1434 if (UseParallelOldGC) { | |
1435 // Par compact uses lower default values since they are treated as | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1436 // minimums. These are different defaults because of the different |
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1437 // interpretation and are not ergonomically set. |
0 | 1438 if (FLAG_IS_DEFAULT(MarkSweepDeadRatio)) { |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1439 FLAG_SET_DEFAULT(MarkSweepDeadRatio, 1); |
0 | 1440 } |
1441 if (FLAG_IS_DEFAULT(PermMarkSweepDeadRatio)) { | |
13
183f41cf8bfe
6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents:
10
diff
changeset
|
1442 FLAG_SET_DEFAULT(PermMarkSweepDeadRatio, 5); |
0 | 1443 } |
1444 } | |
1445 } | |
3322
567c87d484a0
7041501: NUMA: Expand the old gen more aggressively
iveresov
parents:
3315
diff
changeset
|
1446 if (UseNUMA) { |
567c87d484a0
7041501: NUMA: Expand the old gen more aggressively
iveresov
parents:
3315
diff
changeset
|
1447 if (FLAG_IS_DEFAULT(MinHeapDeltaBytes)) { |
567c87d484a0
7041501: NUMA: Expand the old gen more aggressively
iveresov
parents:
3315
diff
changeset
|
1448 FLAG_SET_DEFAULT(MinHeapDeltaBytes, 64*M); |
567c87d484a0
7041501: NUMA: Expand the old gen more aggressively
iveresov
parents:
3315
diff
changeset
|
1449 } |
3885 | 1450 // For those collectors or operating systems (eg, Windows) that do |
1451 // not support full UseNUMA, we will map to UseNUMAInterleaving for now | |
1452 UseNUMAInterleaving = true; | |
3322
567c87d484a0
7041501: NUMA: Expand the old gen more aggressively
iveresov
parents:
3315
diff
changeset
|
1453 } |
0 | 1454 } |
1455 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1456 void Arguments::set_g1_gc_flags() { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1457 assert(UseG1GC, "Error"); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1458 #ifdef COMPILER1 |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1459 FastTLABRefill = false; |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1460 #endif |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1461 FLAG_SET_DEFAULT(ParallelGCThreads, |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1462 Abstract_VM_Version::parallel_worker_threads()); |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1463 if (ParallelGCThreads == 0) { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1464 FLAG_SET_DEFAULT(ParallelGCThreads, |
751 | 1465 Abstract_VM_Version::parallel_worker_threads()); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1466 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1467 no_shared_spaces(); |
751 | 1468 |
1284 | 1469 if (FLAG_IS_DEFAULT(MarkStackSize)) { |
1311
2a1472c30599
4396719: Mark Sweep stack overflow on deeply nested Object arrays
jcoomes
parents:
1284
diff
changeset
|
1470 FLAG_SET_DEFAULT(MarkStackSize, 128 * TASKQUEUE_SIZE); |
1284 | 1471 } |
1472 if (PrintGCDetails && Verbose) { | |
1473 tty->print_cr("MarkStackSize: %uk MarkStackSizeMax: %uk", | |
1474 MarkStackSize / K, MarkStackSizeMax / K); | |
1475 tty->print_cr("ConcGCThreads: %u", ConcGCThreads); | |
1476 } | |
1356 | 1477 |
1478 if (FLAG_IS_DEFAULT(GCTimeRatio) || GCTimeRatio == 0) { | |
1479 // In G1, we want the default GC overhead goal to be higher than | |
1480 // say in PS. So we set it here to 10%. Otherwise the heap might | |
1481 // be expanded more aggressively than we would like it to. In | |
1482 // fact, even 10% seems to not be high enough in some cases | |
1483 // (especially small GC stress tests that the main thing they do | |
1484 // is allocation). We might consider increase it further. | |
1485 FLAG_SET_DEFAULT(GCTimeRatio, 9); | |
1486 } | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1487 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1488 |
1064 | 1489 void Arguments::set_heap_size() { |
1490 if (!FLAG_IS_DEFAULT(DefaultMaxRAMFraction)) { | |
1491 // Deprecated flag | |
1492 FLAG_SET_CMDLINE(uintx, MaxRAMFraction, DefaultMaxRAMFraction); | |
1493 } | |
1494 | |
1495 const julong phys_mem = | |
1496 FLAG_IS_DEFAULT(MaxRAM) ? MIN2(os::physical_memory(), (julong)MaxRAM) | |
1497 : (julong)MaxRAM; | |
1498 | |
1499 // If the maximum heap size has not been set with -Xmx, | |
1500 // then set it as fraction of the size of physical memory, | |
1501 // respecting the maximum and minimum sizes of the heap. | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1502 if (FLAG_IS_DEFAULT(MaxHeapSize)) { |
1064 | 1503 julong reasonable_max = phys_mem / MaxRAMFraction; |
1504 | |
1505 if (phys_mem <= MaxHeapSize * MinRAMFraction) { | |
1506 // Small physical memory, so use a minimum fraction of it for the heap | |
1507 reasonable_max = phys_mem / MinRAMFraction; | |
1508 } else { | |
1509 // Not-small physical memory, so require a heap at least | |
1510 // as large as MaxHeapSize | |
1511 reasonable_max = MAX2(reasonable_max, (julong)MaxHeapSize); | |
1512 } | |
1513 if (!FLAG_IS_DEFAULT(ErgoHeapSizeLimit) && ErgoHeapSizeLimit != 0) { | |
1514 // Limit the heap size to ErgoHeapSizeLimit | |
1515 reasonable_max = MIN2(reasonable_max, (julong)ErgoHeapSizeLimit); | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1516 } |
1064 | 1517 if (UseCompressedOops) { |
1518 // Limit the heap size to the maximum possible when using compressed oops | |
1963 | 1519 julong max_coop_heap = (julong)max_heap_for_compressed_oops(); |
1520 if (HeapBaseMinAddress + MaxHeapSize < max_coop_heap) { | |
1521 // Heap should be above HeapBaseMinAddress to get zero based compressed oops | |
1522 // but it should be not less than default MaxHeapSize. | |
1523 max_coop_heap -= HeapBaseMinAddress; | |
1524 } | |
1525 reasonable_max = MIN2(reasonable_max, max_coop_heap); | |
1064 | 1526 } |
1527 reasonable_max = os::allocatable_physical_memory(reasonable_max); | |
1528 | |
1529 if (!FLAG_IS_DEFAULT(InitialHeapSize)) { | |
1530 // An initial heap size was specified on the command line, | |
1531 // so be sure that the maximum size is consistent. Done | |
1532 // after call to allocatable_physical_memory because that | |
1533 // method might reduce the allocation size. | |
1534 reasonable_max = MAX2(reasonable_max, (julong)InitialHeapSize); | |
1535 } | |
1536 | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1537 if (PrintGCDetails && Verbose) { |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1538 // Cannot use gclog_or_tty yet. |
1064 | 1539 tty->print_cr(" Maximum heap size " SIZE_FORMAT, reasonable_max); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1540 } |
1064 | 1541 FLAG_SET_ERGO(uintx, MaxHeapSize, (uintx)reasonable_max); |
1542 } | |
1543 | |
1544 // If the initial_heap_size has not been set with InitialHeapSize | |
1545 // or -Xms, then set it as fraction of the size of physical memory, | |
1546 // respecting the maximum and minimum sizes of the heap. | |
1547 if (FLAG_IS_DEFAULT(InitialHeapSize)) { | |
1074
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1548 julong reasonable_minimum = (julong)(OldSize + NewSize); |
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1549 |
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1550 reasonable_minimum = MIN2(reasonable_minimum, (julong)MaxHeapSize); |
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1551 |
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1552 reasonable_minimum = os::allocatable_physical_memory(reasonable_minimum); |
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1553 |
1064 | 1554 julong reasonable_initial = phys_mem / InitialRAMFraction; |
1555 | |
1074
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1556 reasonable_initial = MAX2(reasonable_initial, reasonable_minimum); |
1064 | 1557 reasonable_initial = MIN2(reasonable_initial, (julong)MaxHeapSize); |
1558 | |
1559 reasonable_initial = os::allocatable_physical_memory(reasonable_initial); | |
1560 | |
1561 if (PrintGCDetails && Verbose) { | |
1562 // Cannot use gclog_or_tty yet. | |
1563 tty->print_cr(" Initial heap size " SIZE_FORMAT, (uintx)reasonable_initial); | |
1074
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1564 tty->print_cr(" Minimum heap size " SIZE_FORMAT, (uintx)reasonable_minimum); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1565 } |
1064 | 1566 FLAG_SET_ERGO(uintx, InitialHeapSize, (uintx)reasonable_initial); |
1074
84cb6f20afb3
6900899: vm fails to start when -Xmx value is less than OldSize + NewSize
phh
parents:
1069
diff
changeset
|
1567 set_min_heap_size((uintx)reasonable_minimum); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1568 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1569 } |
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1570 |
0 | 1571 // This must be called after ergonomics because we want bytecode rewriting |
1572 // if the server compiler is used, or if UseSharedSpaces is disabled. | |
1573 void Arguments::set_bytecode_flags() { | |
1574 // Better not attempt to store into a read-only space. | |
1575 if (UseSharedSpaces) { | |
1576 FLAG_SET_DEFAULT(RewriteBytecodes, false); | |
1577 FLAG_SET_DEFAULT(RewriteFrequentPairs, false); | |
1578 } | |
1579 | |
1580 if (!RewriteBytecodes) { | |
1581 FLAG_SET_DEFAULT(RewriteFrequentPairs, false); | |
1582 } | |
1583 } | |
1584 | |
1585 // Aggressive optimization flags -XX:+AggressiveOpts | |
1586 void Arguments::set_aggressive_opts_flags() { | |
17
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1587 #ifdef COMPILER2 |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1588 if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) { |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1589 if (FLAG_IS_DEFAULT(EliminateAutoBox)) { |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1590 FLAG_SET_DEFAULT(EliminateAutoBox, true); |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1591 } |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1592 if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) { |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1593 FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000); |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1594 } |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1595 |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1596 // Feed the cache size setting into the JDK |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1597 char buffer[1024]; |
513
2328d1d3f8cf
6781583: Hotspot build fails on linux 64 bit platform with gcc 4.3.2
xlu
parents:
489
diff
changeset
|
1598 sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax); |
17
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1599 add_property(buffer); |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1600 } |
416
b6cfd754403d
6649622: HotSpot Biased locking needs tuning on latest CPUs
never
parents:
363
diff
changeset
|
1601 if (AggressiveOpts && FLAG_IS_DEFAULT(BiasedLockingStartupDelay)) { |
b6cfd754403d
6649622: HotSpot Biased locking needs tuning on latest CPUs
never
parents:
363
diff
changeset
|
1602 FLAG_SET_DEFAULT(BiasedLockingStartupDelay, 500); |
b6cfd754403d
6649622: HotSpot Biased locking needs tuning on latest CPUs
never
parents:
363
diff
changeset
|
1603 } |
17
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1604 #endif |
ff5961f4c095
6395208: Elide autoboxing for calls to HashMap.get(int) and HashMap.get(long)
never
parents:
0
diff
changeset
|
1605 |
0 | 1606 if (AggressiveOpts) { |
61 | 1607 // Sample flag setting code |
1608 // if (FLAG_IS_DEFAULT(EliminateZeroing)) { | |
1609 // FLAG_SET_DEFAULT(EliminateZeroing, true); | |
1610 // } | |
0 | 1611 } |
1612 } | |
1613 | |
1614 //=========================================================================================================== | |
1615 // Parsing of java.compiler property | |
1616 | |
1617 void Arguments::process_java_compiler_argument(char* arg) { | |
1618 // For backwards compatibility, Djava.compiler=NONE or "" | |
1619 // causes us to switch to -Xint mode UNLESS -Xdebug | |
1620 // is also specified. | |
1621 if (strlen(arg) == 0 || strcasecmp(arg, "NONE") == 0) { | |
1622 set_java_compiler(true); // "-Djava.compiler[=...]" most recently seen. | |
1623 } | |
1624 } | |
1625 | |
1626 void Arguments::process_java_launcher_argument(const char* launcher, void* extra_info) { | |
1627 _sun_java_launcher = strdup(launcher); | |
2302
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1628 if (strcmp("gamma", _sun_java_launcher) == 0) { |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1629 _created_by_gamma_launcher = true; |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1630 } |
0 | 1631 } |
1632 | |
1633 bool Arguments::created_by_java_launcher() { | |
1634 assert(_sun_java_launcher != NULL, "property must have value"); | |
1635 return strcmp(DEFAULT_JAVA_LAUNCHER, _sun_java_launcher) != 0; | |
1636 } | |
1637 | |
2302
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1638 bool Arguments::created_by_gamma_launcher() { |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1639 return _created_by_gamma_launcher; |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1640 } |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
1641 |
0 | 1642 //=========================================================================================================== |
1643 // Parsing of main arguments | |
1644 | |
1244
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1645 bool Arguments::verify_interval(uintx val, uintx min, |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1646 uintx max, const char* name) { |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1647 // Returns true iff value is in the inclusive interval [min..max] |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1648 // false, otherwise. |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1649 if (val >= min && val <= max) { |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1650 return true; |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1651 } |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1652 jio_fprintf(defaultStream::error_stream(), |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1653 "%s of " UINTX_FORMAT " is invalid; must be between " UINTX_FORMAT |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1654 " and " UINTX_FORMAT "\n", |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1655 name, val, min, max); |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1656 return false; |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1657 } |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1658 |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1659 bool Arguments::verify_min_value(intx val, intx min, const char* name) { |
2366
1fb790245268
6820066: Check that -XX:ParGCArrayScanChunk has a value larger than zero.
jwilhelm
parents:
2362
diff
changeset
|
1660 // Returns true if given value is at least specified min threshold |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1661 // false, otherwise. |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1662 if (val >= min ) { |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1663 return true; |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1664 } |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1665 jio_fprintf(defaultStream::error_stream(), |
2366
1fb790245268
6820066: Check that -XX:ParGCArrayScanChunk has a value larger than zero.
jwilhelm
parents:
2362
diff
changeset
|
1666 "%s of " INTX_FORMAT " is invalid; must be at least " INTX_FORMAT "\n", |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1667 name, val, min); |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1668 return false; |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1669 } |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1670 |
0 | 1671 bool Arguments::verify_percentage(uintx value, const char* name) { |
1672 if (value <= 100) { | |
1673 return true; | |
1674 } | |
1675 jio_fprintf(defaultStream::error_stream(), | |
1676 "%s of " UINTX_FORMAT " is invalid; must be between 0 and 100\n", | |
1677 name, value); | |
1678 return false; | |
1679 } | |
1680 | |
1064 | 1681 static void force_serial_gc() { |
0 | 1682 FLAG_SET_DEFAULT(UseSerialGC, true); |
1683 FLAG_SET_DEFAULT(UseParNewGC, false); | |
1684 FLAG_SET_DEFAULT(UseConcMarkSweepGC, false); | |
945
68ef3fdcdb76
6872136: CMS: confusing message may be printed when a collector is switched off implicitly
ysr
parents:
932
diff
changeset
|
1685 FLAG_SET_DEFAULT(CMSIncrementalMode, false); // special CMS suboption |
0 | 1686 FLAG_SET_DEFAULT(UseParallelGC, false); |
1687 FLAG_SET_DEFAULT(UseParallelOldGC, false); | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1688 FLAG_SET_DEFAULT(UseG1GC, false); |
0 | 1689 } |
1690 | |
1691 static bool verify_serial_gc_flags() { | |
1692 return (UseSerialGC && | |
945
68ef3fdcdb76
6872136: CMS: confusing message may be printed when a collector is switched off implicitly
ysr
parents:
932
diff
changeset
|
1693 !(UseParNewGC || (UseConcMarkSweepGC || CMSIncrementalMode) || UseG1GC || |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
1694 UseParallelGC || UseParallelOldGC)); |
0 | 1695 } |
1696 | |
3767
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1697 // check if do gclog rotation |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1698 // +UseGCLogFileRotation is a must, |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1699 // no gc log rotation when log file not supplied or |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1700 // NumberOfGCLogFiles is 0, or GCLogFileSize is 0 |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1701 void check_gclog_consistency() { |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1702 if (UseGCLogFileRotation) { |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1703 if ((Arguments::gc_log_filename() == NULL) || |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1704 (NumberOfGCLogFiles == 0) || |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1705 (GCLogFileSize == 0)) { |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1706 jio_fprintf(defaultStream::output_stream(), |
3769
ef2d1b8f2dd4
7051430: CMS: ongoing CMS cycle should terminate abruptly to allow prompt JVM termination at exit
ysr
parents:
3767
diff
changeset
|
1707 "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files> -XX:GCLogFileSize=<num_of_size>\n" |
3767
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1708 "where num_of_file > 0 and num_of_size > 0\n" |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1709 "GC log rotation is turned off\n"); |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1710 UseGCLogFileRotation = false; |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1711 } |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1712 } |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1713 |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1714 if (UseGCLogFileRotation && GCLogFileSize < 8*K) { |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1715 FLAG_SET_CMDLINE(uintx, GCLogFileSize, 8*K); |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1716 jio_fprintf(defaultStream::output_stream(), |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1717 "GCLogFileSize changed to minimum 8K\n"); |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1718 } |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1719 } |
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1720 |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1721 // Check consistency of GC selection |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1722 bool Arguments::check_gc_consistency() { |
3767
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
1723 check_gclog_consistency(); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1724 bool status = true; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1725 // Ensure that the user has not selected conflicting sets |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1726 // of collectors. [Note: this check is merely a user convenience; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1727 // collectors over-ride each other so that only a non-conflicting |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1728 // set is selected; however what the user gets is not what they |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1729 // may have expected from the combination they asked for. It's |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1730 // better to reduce user confusion by not allowing them to |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1731 // select conflicting combinations. |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1732 uint i = 0; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1733 if (UseSerialGC) i++; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1734 if (UseConcMarkSweepGC || UseParNewGC) i++; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1735 if (UseParallelGC || UseParallelOldGC) i++; |
845
df6caf649ff7
6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents:
751
diff
changeset
|
1736 if (UseG1GC) i++; |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1737 if (i > 1) { |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1738 jio_fprintf(defaultStream::error_stream(), |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1739 "Conflicting collector combinations in option list; " |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1740 "please refer to the release notes for the combinations " |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1741 "allowed\n"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1742 status = false; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1743 } |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1744 |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1745 return status; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1746 } |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1747 |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1748 // Check stack pages settings |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1749 bool Arguments::check_stack_pages() |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1750 { |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1751 bool status = true; |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1752 status = status && verify_min_value(StackYellowPages, 1, "StackYellowPages"); |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1753 status = status && verify_min_value(StackRedPages, 1, "StackRedPages"); |
1867
b6aedd1acdc0
6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents:
1864
diff
changeset
|
1754 // greater stack shadow pages can't generate instruction to bang stack |
b6aedd1acdc0
6983240: guarantee((Solaris::min_stack_allowed >= (StackYellowPages+StackRedPages...) wrong
coleenp
parents:
1864
diff
changeset
|
1755 status = status && verify_interval(StackShadowPages, 1, 50, "StackShadowPages"); |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1756 return status; |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1757 } |
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1758 |
0 | 1759 // Check the consistency of vm_init_args |
1760 bool Arguments::check_vm_args_consistency() { | |
1761 // Method for adding checks for flag consistency. | |
1762 // The intent is to warn the user of all possible conflicts, | |
1763 // before returning an error. | |
1764 // Note: Needs platform-dependent factoring. | |
1765 bool status = true; | |
1766 | |
1767 #if ( (defined(COMPILER2) && defined(SPARC))) | |
1768 // NOTE: The call to VM_Version_init depends on the fact that VM_Version_init | |
1769 // on sparc doesn't require generation of a stub as is the case on, e.g., | |
1770 // x86. Normally, VM_Version_init must be called from init_globals in | |
1771 // init.cpp, which is called by the initial java thread *after* arguments | |
1772 // have been parsed. VM_Version_init gets called twice on sparc. | |
1773 extern void VM_Version_init(); | |
1774 VM_Version_init(); | |
1775 if (!VM_Version::has_v9()) { | |
1776 jio_fprintf(defaultStream::error_stream(), | |
1777 "V8 Machine detected, Server requires V9\n"); | |
1778 status = false; | |
1779 } | |
1780 #endif /* COMPILER2 && SPARC */ | |
1781 | |
1782 // Allow both -XX:-UseStackBanging and -XX:-UseBoundThreads in non-product | |
1783 // builds so the cost of stack banging can be measured. | |
1784 #if (defined(PRODUCT) && defined(SOLARIS)) | |
1785 if (!UseBoundThreads && !UseStackBanging) { | |
1786 jio_fprintf(defaultStream::error_stream(), | |
1787 "-UseStackBanging conflicts with -UseBoundThreads\n"); | |
1788 | |
1789 status = false; | |
1790 } | |
1791 #endif | |
1792 | |
1793 if (TLABRefillWasteFraction == 0) { | |
1794 jio_fprintf(defaultStream::error_stream(), | |
1795 "TLABRefillWasteFraction should be a denominator, " | |
1796 "not " SIZE_FORMAT "\n", | |
1797 TLABRefillWasteFraction); | |
1798 status = false; | |
1799 } | |
1800 | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1801 status = status && verify_percentage(AdaptiveSizePolicyWeight, |
0 | 1802 "AdaptiveSizePolicyWeight"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1803 status = status && verify_percentage(AdaptivePermSizeWeight, "AdaptivePermSizeWeight"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1804 status = status && verify_percentage(ThresholdTolerance, "ThresholdTolerance"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1805 status = status && verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1806 status = status && verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio"); |
0 | 1807 |
1808 if (MinHeapFreeRatio > MaxHeapFreeRatio) { | |
1809 jio_fprintf(defaultStream::error_stream(), | |
1810 "MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or " | |
1811 "equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n", | |
1812 MinHeapFreeRatio, MaxHeapFreeRatio); | |
1813 status = false; | |
1814 } | |
1815 // Keeping the heap 100% free is hard ;-) so limit it to 99%. | |
1816 MinHeapFreeRatio = MIN2(MinHeapFreeRatio, (uintx) 99); | |
1817 | |
1818 if (FullGCALot && FLAG_IS_DEFAULT(MarkSweepAlwaysCompactCount)) { | |
1819 MarkSweepAlwaysCompactCount = 1; // Move objects every gc. | |
1820 } | |
1821 | |
483
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1822 if (UseParallelOldGC && ParallelOldGCSplitALot) { |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1823 // Settings to encourage splitting. |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1824 if (!FLAG_IS_CMDLINE(NewRatio)) { |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1825 FLAG_SET_CMDLINE(intx, NewRatio, 2); |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1826 } |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1827 if (!FLAG_IS_CMDLINE(ScavengeBeforeFullGC)) { |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1828 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1829 } |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1830 } |
0f773163217d
6765954: par compact - stress mode for splitting young gen spaces
jcoomes
parents:
449
diff
changeset
|
1831 |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1832 status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit"); |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1833 status = status && verify_percentage(GCTimeLimit, "GCTimeLimit"); |
0 | 1834 if (GCTimeLimit == 100) { |
1835 // Turn off gc-overhead-limit-exceeded checks | |
1836 FLAG_SET_DEFAULT(UseGCOverheadLimit, false); | |
1837 } | |
1838 | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1839 status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit"); |
0 | 1840 |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1841 status = status && check_gc_consistency(); |
1744
f8c5d1bdaad4
6885308: The incorrect -XX:StackRedPages, -XX:StackShadowPages, -XX:StackYellowPages could cause VM crash
ptisnovs
parents:
1681
diff
changeset
|
1842 status = status && check_stack_pages(); |
0 | 1843 |
1844 if (_has_alloc_profile) { | |
1845 if (UseParallelGC || UseParallelOldGC) { | |
1846 jio_fprintf(defaultStream::error_stream(), | |
1847 "error: invalid argument combination.\n" | |
1848 "Allocation profiling (-Xaprof) cannot be used together with " | |
1849 "Parallel GC (-XX:+UseParallelGC or -XX:+UseParallelOldGC).\n"); | |
1850 status = false; | |
1851 } | |
1852 if (UseConcMarkSweepGC) { | |
1853 jio_fprintf(defaultStream::error_stream(), | |
1854 "error: invalid argument combination.\n" | |
1855 "Allocation profiling (-Xaprof) cannot be used together with " | |
1856 "the CMS collector (-XX:+UseConcMarkSweepGC).\n"); | |
1857 status = false; | |
1858 } | |
1859 } | |
1860 | |
1861 if (CMSIncrementalMode) { | |
1862 if (!UseConcMarkSweepGC) { | |
1863 jio_fprintf(defaultStream::error_stream(), | |
1864 "error: invalid argument combination.\n" | |
1865 "The CMS collector (-XX:+UseConcMarkSweepGC) must be " | |
1866 "selected in order\nto use CMSIncrementalMode.\n"); | |
1867 status = false; | |
1868 } else { | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1869 status = status && verify_percentage(CMSIncrementalDutyCycle, |
0 | 1870 "CMSIncrementalDutyCycle"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1871 status = status && verify_percentage(CMSIncrementalDutyCycleMin, |
0 | 1872 "CMSIncrementalDutyCycleMin"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1873 status = status && verify_percentage(CMSIncrementalSafetyFactor, |
0 | 1874 "CMSIncrementalSafetyFactor"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1875 status = status && verify_percentage(CMSIncrementalOffset, |
0 | 1876 "CMSIncrementalOffset"); |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
1877 status = status && verify_percentage(CMSExpAvgFactor, |
0 | 1878 "CMSExpAvgFactor"); |
1879 // If it was not set on the command line, set | |
1880 // CMSInitiatingOccupancyFraction to 1 so icms can initiate cycles early. | |
1881 if (CMSInitiatingOccupancyFraction < 0) { | |
1882 FLAG_SET_DEFAULT(CMSInitiatingOccupancyFraction, 1); | |
1883 } | |
1884 } | |
1885 } | |
1886 | |
1887 // CMS space iteration, which FLSVerifyAllHeapreferences entails, | |
1888 // insists that we hold the requisite locks so that the iteration is | |
1889 // MT-safe. For the verification at start-up and shut-down, we don't | |
1890 // yet have a good way of acquiring and releasing these locks, | |
1891 // which are not visible at the CollectedHeap level. We want to | |
1892 // be able to acquire these locks and then do the iteration rather | |
1893 // than just disable the lock verification. This will be fixed under | |
1894 // bug 4788986. | |
1895 if (UseConcMarkSweepGC && FLSVerifyAllHeapReferences) { | |
1896 if (VerifyGCStartAt == 0) { | |
1897 warning("Heap verification at start-up disabled " | |
1898 "(due to current incompatibility with FLSVerifyAllHeapReferences)"); | |
1899 VerifyGCStartAt = 1; // Disable verification at start-up | |
1900 } | |
1901 if (VerifyBeforeExit) { | |
1902 warning("Heap verification at shutdown disabled " | |
1903 "(due to current incompatibility with FLSVerifyAllHeapReferences)"); | |
1904 VerifyBeforeExit = false; // Disable verification at shutdown | |
1905 } | |
1906 } | |
1907 | |
1908 // Note: only executed in non-PRODUCT mode | |
1909 if (!UseAsyncConcMarkSweepGC && | |
1910 (ExplicitGCInvokesConcurrent || | |
1911 ExplicitGCInvokesConcurrentAndUnloadsClasses)) { | |
1912 jio_fprintf(defaultStream::error_stream(), | |
1913 "error: +ExplictGCInvokesConcurrent[AndUnloadsClasses] conflicts" | |
1914 " with -UseAsyncConcMarkSweepGC"); | |
1915 status = false; | |
1916 } | |
1917 | |
2366
1fb790245268
6820066: Check that -XX:ParGCArrayScanChunk has a value larger than zero.
jwilhelm
parents:
2362
diff
changeset
|
1918 status = status && verify_min_value(ParGCArrayScanChunk, 1, "ParGCArrayScanChunk"); |
1fb790245268
6820066: Check that -XX:ParGCArrayScanChunk has a value larger than zero.
jwilhelm
parents:
2362
diff
changeset
|
1919 |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1920 #ifndef SERIALGC |
1283
1c72304f1885
6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents:
1257
diff
changeset
|
1921 if (UseG1GC) { |
1c72304f1885
6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents:
1257
diff
changeset
|
1922 status = status && verify_percentage(InitiatingHeapOccupancyPercent, |
1c72304f1885
6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents:
1257
diff
changeset
|
1923 "InitiatingHeapOccupancyPercent"); |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1924 status = status && verify_min_value(G1RefProcDrainInterval, 1, |
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1925 "G1RefProcDrainInterval"); |
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1926 status = status && verify_min_value((intx)G1ConcMarkStepDurationMillis, 1, |
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1927 "G1ConcMarkStepDurationMillis"); |
1283
1c72304f1885
6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents:
1257
diff
changeset
|
1928 } |
2174
234761c55641
6608385: G1: need to support parallel reference processing
johnc
parents:
2129
diff
changeset
|
1929 #endif |
1283
1c72304f1885
6928073: G1: use existing command line parameters for marking cycle initiation
tonyp
parents:
1257
diff
changeset
|
1930 |
1244
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1931 status = status && verify_interval(RefDiscoveryPolicy, |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1932 ReferenceProcessor::DiscoveryPolicyMin, |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1933 ReferenceProcessor::DiscoveryPolicyMax, |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1934 "RefDiscoveryPolicy"); |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1935 |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1936 // Limit the lower bound of this flag to 1 as it is used in a division |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1937 // expression. |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1938 status = status && verify_interval(TLABWasteTargetPercent, |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1939 1, 100, "TLABWasteTargetPercent"); |
745c853ee57f
6885297: java -XX:RefDiscoveryPolicy=2 or -XX:TLABWasteTargetPercent=0 cause VM crash
johnc
parents:
1188
diff
changeset
|
1940 |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1941 status = status && verify_object_alignment(); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
1942 |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1943 #ifdef GRAAL |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1944 if (UseCompressedOops) { |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1945 jio_fprintf(defaultStream::error_stream(), |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1946 "CompressedOops are not supported in Graal at the moment\n"); |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1947 status = false; |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1948 } |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1949 if (UseG1GC) { |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1950 jio_fprintf(defaultStream::error_stream(), |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1951 "G1 is not supported in Graal at the moment\n"); |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1952 status = false; |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1953 } |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1954 #endif |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
1955 |
0 | 1956 return status; |
1957 } | |
1958 | |
1959 bool Arguments::is_bad_option(const JavaVMOption* option, jboolean ignore, | |
1960 const char* option_type) { | |
1961 if (ignore) return false; | |
1962 | |
1963 const char* spacer = " "; | |
1964 if (option_type == NULL) { | |
1965 option_type = ++spacer; // Set both to the empty string. | |
1966 } | |
1967 | |
1968 if (os::obsolete_option(option)) { | |
1969 jio_fprintf(defaultStream::error_stream(), | |
1970 "Obsolete %s%soption: %s\n", option_type, spacer, | |
1971 option->optionString); | |
1972 return false; | |
1973 } else { | |
1974 jio_fprintf(defaultStream::error_stream(), | |
1975 "Unrecognized %s%soption: %s\n", option_type, spacer, | |
1976 option->optionString); | |
1977 return true; | |
1978 } | |
1979 } | |
1980 | |
1981 static const char* user_assertion_options[] = { | |
1982 "-da", "-ea", "-disableassertions", "-enableassertions", 0 | |
1983 }; | |
1984 | |
1985 static const char* system_assertion_options[] = { | |
1986 "-dsa", "-esa", "-disablesystemassertions", "-enablesystemassertions", 0 | |
1987 }; | |
1988 | |
1989 // Return true if any of the strings in null-terminated array 'names' matches. | |
1990 // If tail_allowed is true, then the tail must begin with a colon; otherwise, | |
1991 // the option must match exactly. | |
1992 static bool match_option(const JavaVMOption* option, const char** names, const char** tail, | |
1993 bool tail_allowed) { | |
1994 for (/* empty */; *names != NULL; ++names) { | |
1995 if (match_option(option, *names, tail)) { | |
1996 if (**tail == '\0' || tail_allowed && **tail == ':') { | |
1997 return true; | |
1998 } | |
1999 } | |
2000 } | |
2001 return false; | |
2002 } | |
2003 | |
1284 | 2004 bool Arguments::parse_uintx(const char* value, |
2005 uintx* uintx_arg, | |
2006 uintx min_size) { | |
2007 | |
2008 // Check the sign first since atomull() parses only unsigned values. | |
2009 bool value_is_positive = !(*value == '-'); | |
2010 | |
2011 if (value_is_positive) { | |
2012 julong n; | |
2013 bool good_return = atomull(value, &n); | |
2014 if (good_return) { | |
2015 bool above_minimum = n >= min_size; | |
2016 bool value_is_too_large = n > max_uintx; | |
2017 | |
2018 if (above_minimum && !value_is_too_large) { | |
2019 *uintx_arg = n; | |
2020 return true; | |
2021 } | |
2022 } | |
2023 } | |
2024 return false; | |
2025 } | |
2026 | |
0 | 2027 Arguments::ArgsRange Arguments::parse_memory_size(const char* s, |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2028 julong* long_arg, |
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2029 julong min_size) { |
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2030 if (!atomull(s, long_arg)) return arg_unreadable; |
0 | 2031 return check_memory_size(*long_arg, min_size); |
2032 } | |
2033 | |
2034 // Parse JavaVMInitArgs structure | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2035 #ifdef GRAAL |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2036 static void prepend_to_graal_classpath(SysClassPath &cp, const char* graal_dir, const char* project) { |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2037 const int BUFFER_SIZE = 1024; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2038 char path[BUFFER_SIZE]; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2039 |
4252
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2040 const char fileSep = *os::file_separator(); |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2041 sprintf(path, "%s%c%s%cbin", graal_dir, fileSep, project, fileSep); |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2042 DIR* dir = os::opendir(path); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2043 if (dir == NULL) { |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2044 jio_fprintf(defaultStream::output_stream(), "Error while starting Graal VM: The Graal class directory %s could not be opened.\n", path); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2045 vm_exit(1); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2046 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2047 os::closedir(dir); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2048 cp.add_prefix(path); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2049 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2050 |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2051 // Walk up the directory hierarchy starting from JAVA_HOME looking |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2052 // for a directory named "graal". If found, then the full path to |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2053 // this directory is returned in graal_dir. |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2054 static bool find_graal_dir(char* graal_dir) { |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2055 strcpy(graal_dir, Arguments::get_java_home()); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2056 char* end = graal_dir + strlen(graal_dir); |
4252
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2057 const char fileSep = *os::file_separator(); |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2058 while (end != graal_dir) { |
4252
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2059 if (fileSep == '/') |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2060 strcat(graal_dir, "/graal"); |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2061 else { |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2062 assert(fileSep == '\\', "unexpected separator char"); |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2063 strcat(graal_dir, "\\graal"); |
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2064 } |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2065 DIR* dir = os::opendir(graal_dir); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2066 if (dir != NULL) { |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2067 os::closedir(dir); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2068 return true; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2069 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2070 *end = 0; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2071 while (end != graal_dir) { |
4252
67e88b7624d5
Removed need for GRAAL environment variable on Windows.
Doug Simon <doug.simon@oracle.com>
parents:
4205
diff
changeset
|
2072 if (*end == fileSep) { |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2073 *end = 0; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2074 break; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2075 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2076 end--; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2077 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2078 } |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2079 return false; |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2080 } |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2081 #endif |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2082 |
0 | 2083 jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) { |
2084 // For components of the system classpath. | |
2085 SysClassPath scp(Arguments::get_sysclasspath()); | |
2086 bool scp_assembly_required = false; | |
2087 | |
2088 // Save default settings for some mode flags | |
2089 Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods; | |
2090 Arguments::_UseOnStackReplacement = UseOnStackReplacement; | |
2091 Arguments::_ClipInlining = ClipInlining; | |
2092 Arguments::_BackgroundCompilation = BackgroundCompilation; | |
2093 | |
3341
e9b8ef09622a
7041582: set_mode_flags isn't called without -Xmixed specified
never
parents:
3261
diff
changeset
|
2094 // Setup flags for mixed which is the default |
e9b8ef09622a
7041582: set_mode_flags isn't called without -Xmixed specified
never
parents:
3261
diff
changeset
|
2095 set_mode_flags(_mixed); |
e9b8ef09622a
7041582: set_mode_flags isn't called without -Xmixed specified
never
parents:
3261
diff
changeset
|
2096 |
0 | 2097 // Parse JAVA_TOOL_OPTIONS environment variable (if present) |
2098 jint result = parse_java_tool_options_environment_variable(&scp, &scp_assembly_required); | |
2099 if (result != JNI_OK) { | |
2100 return result; | |
2101 } | |
2102 | |
2103 // Parse JavaVMInitArgs structure passed in | |
2104 result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, COMMAND_LINE); | |
2105 if (result != JNI_OK) { | |
2106 return result; | |
2107 } | |
2108 | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2109 #ifdef GRAAL |
3543
344264424174
Enable debugging of compiler code from Java IDEs. Moved binary to "graal" subdirectory. New flag for starting Graal is just "-graal".
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3535
diff
changeset
|
2110 if (PrintVMOptions) { |
3568
409ef3a68dc8
re-lock objects whose lock was removed by escape analysis, enable stack walking compilation policy (-XX:CompilationPolicyChoice=1)
Lukas Stadler <lukas.stadler@jku.at>
parents:
3546
diff
changeset
|
2111 tty->print_cr("Running Graal VM... "); |
3543
344264424174
Enable debugging of compiler code from Java IDEs. Moved binary to "graal" subdirectory. New flag for starting Graal is just "-graal".
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3535
diff
changeset
|
2112 } |
344264424174
Enable debugging of compiler code from Java IDEs. Moved binary to "graal" subdirectory. New flag for starting Graal is just "-graal".
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3535
diff
changeset
|
2113 const int BUFFER_SIZE = 1024; |
3736
d3ec27ea1b20
Work with GRAAL environment variable instead of MAXINE environment variable.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
3601
diff
changeset
|
2114 char graal_dir[BUFFER_SIZE]; |
d3ec27ea1b20
Work with GRAAL environment variable instead of MAXINE environment variable.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
3601
diff
changeset
|
2115 if (!os::getenv("GRAAL", graal_dir, sizeof(graal_dir))) { |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2116 if (find_graal_dir(graal_dir) == false) { |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2117 jio_fprintf(defaultStream::output_stream(), "Error while starting Graal VM: The GRAAL environment variable needs to point to the directory containing the Graal projects.\n"); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2118 vm_exit(0); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2119 } |
3543
344264424174
Enable debugging of compiler code from Java IDEs. Moved binary to "graal" subdirectory. New flag for starting Graal is just "-graal".
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3535
diff
changeset
|
2120 } |
3736
d3ec27ea1b20
Work with GRAAL environment variable instead of MAXINE environment variable.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
3601
diff
changeset
|
2121 if (PrintVMOptions) tty->print_cr("GRAAL=%s", graal_dir); |
4345
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2122 |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2123 SysClassPath scp_compiler(Arguments::get_sysclasspath()); |
4345
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2124 struct dirent* dentry; |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2125 char* tdbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(graal_dir)); |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2126 errno = 0; |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2127 DIR* graal_dir_handle = os::opendir(graal_dir); |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2128 while ((dentry = os::readdir(graal_dir_handle, (struct dirent *)tdbuf)) != NULL) { |
4587
5b04b33dac74
add jtt tests, converted from the maxine repository using ConvertJTT
Lukas Stadler <lukas.stadler@jku.at>
parents:
4560
diff
changeset
|
2129 if (strcmp(dentry->d_name, ".") != 0 && strcmp(dentry->d_name, "..") != 0 && strcmp(dentry->d_name, "com.oracle.max.graal.tests") != 0 && strcmp(dentry->d_name, "com.oracle.max.graal.jtt") != 0) { |
4345
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2130 prepend_to_graal_classpath(scp_compiler, graal_dir, dentry->d_name); |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2131 if (PrintVMOptions) { |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2132 tty->print_cr("Adding project directory %s to bootclasspath", dentry->d_name); |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2133 } |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2134 } |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2135 } |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2136 os::closedir(graal_dir_handle); |
176d60b77d31
Moved PrintCompilation logic from graal.compiler to graal.hotspot. Made bootclasspath generated from the GRAAL environment option more generic (such that adding/removing a project requires no changes in the C++ part).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4252
diff
changeset
|
2137 FREE_C_HEAP_ARRAY(char, tdbuf); |
4155
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2138 scp_compiler.expand_endorsed(); |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2139 |
394404b2d9bd
Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
Doug Simon <doug.simon@oracle.com>
parents:
4137
diff
changeset
|
2140 Arguments::set_compilerclasspath(scp_compiler.combined_path()); |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2141 #endif |
3543
344264424174
Enable debugging of compiler code from Java IDEs. Moved binary to "graal" subdirectory. New flag for starting Graal is just "-graal".
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
3535
diff
changeset
|
2142 |
531
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2143 if (AggressiveOpts) { |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2144 // Insert alt-rt.jar between user-specified bootclasspath |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2145 // prefix and the default bootclasspath. os::set_boot_path() |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2146 // uses meta_index_dir as the default bootclasspath directory. |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2147 const char* altclasses_jar = "alt-rt.jar"; |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2148 size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 + |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2149 strlen(altclasses_jar); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2150 char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2151 strcpy(altclasses_path, get_meta_index_dir()); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2152 strcat(altclasses_path, altclasses_jar); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2153 scp.add_suffix_to_prefix(altclasses_path); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2154 scp_assembly_required = true; |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2155 FREE_C_HEAP_ARRAY(char, altclasses_path); |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2156 } |
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2157 |
0 | 2158 // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM) |
2159 result = parse_java_options_environment_variable(&scp, &scp_assembly_required); | |
2160 if (result != JNI_OK) { | |
2161 return result; | |
2162 } | |
2163 | |
2164 // Do final processing now that all arguments have been parsed | |
2165 result = finalize_vm_init_args(&scp, scp_assembly_required); | |
2166 if (result != JNI_OK) { | |
2167 return result; | |
2168 } | |
2169 | |
2170 return JNI_OK; | |
2171 } | |
2172 | |
2173 jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, | |
2174 SysClassPath* scp_p, | |
2175 bool* scp_assembly_required_p, | |
2176 FlagValueOrigin origin) { | |
2177 // Remaining part of option string | |
2178 const char* tail; | |
2179 | |
2180 // iterate over arguments | |
2181 for (int index = 0; index < args->nOptions; index++) { | |
2182 bool is_absolute_path = false; // for -agentpath vs -agentlib | |
2183 | |
2184 const JavaVMOption* option = args->options + index; | |
2185 | |
2186 if (!match_option(option, "-Djava.class.path", &tail) && | |
2187 !match_option(option, "-Dsun.java.command", &tail) && | |
2188 !match_option(option, "-Dsun.java.launcher", &tail)) { | |
2189 | |
2190 // add all jvm options to the jvm_args string. This string | |
2191 // is used later to set the java.vm.args PerfData string constant. | |
2192 // the -Djava.class.path and the -Dsun.java.command options are | |
2193 // omitted from jvm_args string as each have their own PerfData | |
2194 // string constant object. | |
2195 build_jvm_args(option->optionString); | |
2196 } | |
2197 | |
2198 // -verbose:[class/gc/jni] | |
2199 if (match_option(option, "-verbose", &tail)) { | |
2200 if (!strcmp(tail, ":class") || !strcmp(tail, "")) { | |
2201 FLAG_SET_CMDLINE(bool, TraceClassLoading, true); | |
2202 FLAG_SET_CMDLINE(bool, TraceClassUnloading, true); | |
2203 } else if (!strcmp(tail, ":gc")) { | |
2204 FLAG_SET_CMDLINE(bool, PrintGC, true); | |
2205 } else if (!strcmp(tail, ":jni")) { | |
2206 FLAG_SET_CMDLINE(bool, PrintJNIResolving, true); | |
2207 } | |
2208 // -da / -ea / -disableassertions / -enableassertions | |
2209 // These accept an optional class/package name separated by a colon, e.g., | |
2210 // -da:java.lang.Thread. | |
2211 } else if (match_option(option, user_assertion_options, &tail, true)) { | |
2212 bool enable = option->optionString[1] == 'e'; // char after '-' is 'e' | |
2213 if (*tail == '\0') { | |
2214 JavaAssertions::setUserClassDefault(enable); | |
2215 } else { | |
2216 assert(*tail == ':', "bogus match by match_option()"); | |
2217 JavaAssertions::addOption(tail + 1, enable); | |
2218 } | |
2219 // -dsa / -esa / -disablesystemassertions / -enablesystemassertions | |
2220 } else if (match_option(option, system_assertion_options, &tail, false)) { | |
2221 bool enable = option->optionString[1] == 'e'; // char after '-' is 'e' | |
2222 JavaAssertions::setSystemClassDefault(enable); | |
2223 // -bootclasspath: | |
2224 } else if (match_option(option, "-Xbootclasspath:", &tail)) { | |
2225 scp_p->reset_path(tail); | |
2226 *scp_assembly_required_p = true; | |
2227 // -bootclasspath/a: | |
2228 } else if (match_option(option, "-Xbootclasspath/a:", &tail)) { | |
2229 scp_p->add_suffix(tail); | |
2230 *scp_assembly_required_p = true; | |
2231 // -bootclasspath/p: | |
2232 } else if (match_option(option, "-Xbootclasspath/p:", &tail)) { | |
2233 scp_p->add_prefix(tail); | |
2234 *scp_assembly_required_p = true; | |
2235 // -Xrun | |
2236 } else if (match_option(option, "-Xrun", &tail)) { | |
531
40ee984935b9
6792705: Add JAR file to bootclasspath when using AggressiveOpts
phh
parents:
513
diff
changeset
|
2237 if (tail != NULL) { |
0 | 2238 const char* pos = strchr(tail, ':'); |
2239 size_t len = (pos == NULL) ? strlen(tail) : pos - tail; | |
2240 char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); | |
2241 name[len] = '\0'; | |
2242 | |
2243 char *options = NULL; | |
2244 if(pos != NULL) { | |
2245 size_t len2 = strlen(pos+1) + 1; // options start after ':'. Final zero must be copied. | |
2246 options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2), pos+1, len2); | |
2247 } | |
2248 #ifdef JVMTI_KERNEL | |
2249 if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) { | |
2250 warning("profiling and debugging agents are not supported with Kernel VM"); | |
2251 } else | |
2252 #endif // JVMTI_KERNEL | |
2253 add_init_library(name, options); | |
2254 } | |
2255 // -agentlib and -agentpath | |
2256 } else if (match_option(option, "-agentlib:", &tail) || | |
2257 (is_absolute_path = match_option(option, "-agentpath:", &tail))) { | |
2258 if(tail != NULL) { | |
2259 const char* pos = strchr(tail, '='); | |
2260 size_t len = (pos == NULL) ? strlen(tail) : pos - tail; | |
2261 char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); | |
2262 name[len] = '\0'; | |
2263 | |
2264 char *options = NULL; | |
2265 if(pos != NULL) { | |
2266 options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1), pos + 1); | |
2267 } | |
2268 #ifdef JVMTI_KERNEL | |
2269 if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) { | |
2270 warning("profiling and debugging agents are not supported with Kernel VM"); | |
2271 } else | |
2272 #endif // JVMTI_KERNEL | |
2273 add_init_agent(name, options, is_absolute_path); | |
2274 | |
2275 } | |
2276 // -javaagent | |
2277 } else if (match_option(option, "-javaagent:", &tail)) { | |
2278 if(tail != NULL) { | |
2279 char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1), tail); | |
2280 add_init_agent("instrument", options, false); | |
2281 } | |
2282 // -Xnoclassgc | |
2283 } else if (match_option(option, "-Xnoclassgc", &tail)) { | |
2284 FLAG_SET_CMDLINE(bool, ClassUnloading, false); | |
2285 // -Xincgc: i-CMS | |
2286 } else if (match_option(option, "-Xincgc", &tail)) { | |
2287 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true); | |
2288 FLAG_SET_CMDLINE(bool, CMSIncrementalMode, true); | |
2289 // -Xnoincgc: no i-CMS | |
2290 } else if (match_option(option, "-Xnoincgc", &tail)) { | |
2291 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false); | |
2292 FLAG_SET_CMDLINE(bool, CMSIncrementalMode, false); | |
2293 // -Xconcgc | |
2294 } else if (match_option(option, "-Xconcgc", &tail)) { | |
2295 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true); | |
2296 // -Xnoconcgc | |
2297 } else if (match_option(option, "-Xnoconcgc", &tail)) { | |
2298 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false); | |
2299 // -Xbatch | |
2300 } else if (match_option(option, "-Xbatch", &tail)) { | |
2301 FLAG_SET_CMDLINE(bool, BackgroundCompilation, false); | |
2302 // -Xmn for compatibility with other JVM vendors | |
2303 } else if (match_option(option, "-Xmn", &tail)) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2304 julong long_initial_eden_size = 0; |
0 | 2305 ArgsRange errcode = parse_memory_size(tail, &long_initial_eden_size, 1); |
2306 if (errcode != arg_in_range) { | |
2307 jio_fprintf(defaultStream::error_stream(), | |
2308 "Invalid initial eden size: %s\n", option->optionString); | |
2309 describe_range_error(errcode); | |
2310 return JNI_EINVAL; | |
2311 } | |
1064 | 2312 FLAG_SET_CMDLINE(uintx, MaxNewSize, (uintx)long_initial_eden_size); |
2313 FLAG_SET_CMDLINE(uintx, NewSize, (uintx)long_initial_eden_size); | |
0 | 2314 // -Xms |
2315 } else if (match_option(option, "-Xms", &tail)) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2316 julong long_initial_heap_size = 0; |
0 | 2317 ArgsRange errcode = parse_memory_size(tail, &long_initial_heap_size, 1); |
2318 if (errcode != arg_in_range) { | |
2319 jio_fprintf(defaultStream::error_stream(), | |
2320 "Invalid initial heap size: %s\n", option->optionString); | |
2321 describe_range_error(errcode); | |
2322 return JNI_EINVAL; | |
2323 } | |
1064 | 2324 FLAG_SET_CMDLINE(uintx, InitialHeapSize, (uintx)long_initial_heap_size); |
0 | 2325 // Currently the minimum size and the initial heap sizes are the same. |
1064 | 2326 set_min_heap_size(InitialHeapSize); |
0 | 2327 // -Xmx |
2328 } else if (match_option(option, "-Xmx", &tail)) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2329 julong long_max_heap_size = 0; |
0 | 2330 ArgsRange errcode = parse_memory_size(tail, &long_max_heap_size, 1); |
2331 if (errcode != arg_in_range) { | |
2332 jio_fprintf(defaultStream::error_stream(), | |
2333 "Invalid maximum heap size: %s\n", option->optionString); | |
2334 describe_range_error(errcode); | |
2335 return JNI_EINVAL; | |
2336 } | |
1064 | 2337 FLAG_SET_CMDLINE(uintx, MaxHeapSize, (uintx)long_max_heap_size); |
0 | 2338 // Xmaxf |
2339 } else if (match_option(option, "-Xmaxf", &tail)) { | |
2340 int maxf = (int)(atof(tail) * 100); | |
2341 if (maxf < 0 || maxf > 100) { | |
2342 jio_fprintf(defaultStream::error_stream(), | |
2343 "Bad max heap free percentage size: %s\n", | |
2344 option->optionString); | |
2345 return JNI_EINVAL; | |
2346 } else { | |
2347 FLAG_SET_CMDLINE(uintx, MaxHeapFreeRatio, maxf); | |
2348 } | |
2349 // Xminf | |
2350 } else if (match_option(option, "-Xminf", &tail)) { | |
2351 int minf = (int)(atof(tail) * 100); | |
2352 if (minf < 0 || minf > 100) { | |
2353 jio_fprintf(defaultStream::error_stream(), | |
2354 "Bad min heap free percentage size: %s\n", | |
2355 option->optionString); | |
2356 return JNI_EINVAL; | |
2357 } else { | |
2358 FLAG_SET_CMDLINE(uintx, MinHeapFreeRatio, minf); | |
2359 } | |
2360 // -Xss | |
2361 } else if (match_option(option, "-Xss", &tail)) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2362 julong long_ThreadStackSize = 0; |
0 | 2363 ArgsRange errcode = parse_memory_size(tail, &long_ThreadStackSize, 1000); |
2364 if (errcode != arg_in_range) { | |
2365 jio_fprintf(defaultStream::error_stream(), | |
2366 "Invalid thread stack size: %s\n", option->optionString); | |
2367 describe_range_error(errcode); | |
2368 return JNI_EINVAL; | |
2369 } | |
2370 // Internally track ThreadStackSize in units of 1024 bytes. | |
2371 FLAG_SET_CMDLINE(intx, ThreadStackSize, | |
2372 round_to((int)long_ThreadStackSize, K) / K); | |
2373 // -Xoss | |
2374 } else if (match_option(option, "-Xoss", &tail)) { | |
2375 // HotSpot does not have separate native and Java stacks, ignore silently for compatibility | |
2376 // -Xmaxjitcodesize | |
2095
36c186bcc085
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents:
2002
diff
changeset
|
2377 } else if (match_option(option, "-Xmaxjitcodesize", &tail) || |
36c186bcc085
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents:
2002
diff
changeset
|
2378 match_option(option, "-XX:ReservedCodeCacheSize=", &tail)) { |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2379 julong long_ReservedCodeCacheSize = 0; |
0 | 2380 ArgsRange errcode = parse_memory_size(tail, &long_ReservedCodeCacheSize, |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2381 (size_t)InitialCodeCacheSize); |
0 | 2382 if (errcode != arg_in_range) { |
2383 jio_fprintf(defaultStream::error_stream(), | |
2095
36c186bcc085
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents:
2002
diff
changeset
|
2384 "Invalid maximum code cache size: %s. Should be greater than InitialCodeCacheSize=%dK\n", |
36c186bcc085
6302804: Hotspot VM dies ungraceful death when C heap is exhausted in various places.
coleenp
parents:
2002
diff
changeset
|
2385 option->optionString, InitialCodeCacheSize/K); |
0 | 2386 describe_range_error(errcode); |
2387 return JNI_EINVAL; | |
2388 } | |
2389 FLAG_SET_CMDLINE(uintx, ReservedCodeCacheSize, (uintx)long_ReservedCodeCacheSize); | |
2390 // -green | |
2391 } else if (match_option(option, "-green", &tail)) { | |
2392 jio_fprintf(defaultStream::error_stream(), | |
2393 "Green threads support not available\n"); | |
2394 return JNI_EINVAL; | |
2395 // -native | |
2396 } else if (match_option(option, "-native", &tail)) { | |
2397 // HotSpot always uses native threads, ignore silently for compatibility | |
2398 // -Xsqnopause | |
2399 } else if (match_option(option, "-Xsqnopause", &tail)) { | |
2400 // EVM option, ignore silently for compatibility | |
2401 // -Xrs | |
2402 } else if (match_option(option, "-Xrs", &tail)) { | |
2403 // Classic/EVM option, new functionality | |
2404 FLAG_SET_CMDLINE(bool, ReduceSignalUsage, true); | |
2405 } else if (match_option(option, "-Xusealtsigs", &tail)) { | |
2406 // change default internal VM signals used - lower case for back compat | |
2407 FLAG_SET_CMDLINE(bool, UseAltSigs, true); | |
2408 // -Xoptimize | |
2409 } else if (match_option(option, "-Xoptimize", &tail)) { | |
2410 // EVM option, ignore silently for compatibility | |
2411 // -Xprof | |
2412 } else if (match_option(option, "-Xprof", &tail)) { | |
2413 #ifndef FPROF_KERNEL | |
2414 _has_profile = true; | |
2415 #else // FPROF_KERNEL | |
2416 // do we have to exit? | |
2417 warning("Kernel VM does not support flat profiling."); | |
2418 #endif // FPROF_KERNEL | |
2419 // -Xaprof | |
2420 } else if (match_option(option, "-Xaprof", &tail)) { | |
2421 _has_alloc_profile = true; | |
2422 // -Xconcurrentio | |
2423 } else if (match_option(option, "-Xconcurrentio", &tail)) { | |
2424 FLAG_SET_CMDLINE(bool, UseLWPSynchronization, true); | |
2425 FLAG_SET_CMDLINE(bool, BackgroundCompilation, false); | |
2426 FLAG_SET_CMDLINE(intx, DeferThrSuspendLoopCount, 1); | |
2427 FLAG_SET_CMDLINE(bool, UseTLAB, false); | |
2428 FLAG_SET_CMDLINE(uintx, NewSizeThreadIncrease, 16 * K); // 20Kb per thread added to new generation | |
2429 | |
2430 // -Xinternalversion | |
2431 } else if (match_option(option, "-Xinternalversion", &tail)) { | |
2432 jio_fprintf(defaultStream::output_stream(), "%s\n", | |
2433 VM_Version::internal_vm_info_string()); | |
2434 vm_exit(0); | |
2435 #ifndef PRODUCT | |
2436 // -Xprintflags | |
2437 } else if (match_option(option, "-Xprintflags", &tail)) { | |
2438 CommandLineFlags::printFlags(); | |
2439 vm_exit(0); | |
2440 #endif | |
2441 // -D | |
2442 } else if (match_option(option, "-D", &tail)) { | |
2443 if (!add_property(tail)) { | |
2444 return JNI_ENOMEM; | |
2445 } | |
2446 // Out of the box management support | |
2447 if (match_option(option, "-Dcom.sun.management", &tail)) { | |
2448 FLAG_SET_CMDLINE(bool, ManagementServer, true); | |
2449 } | |
2450 // -Xint | |
2451 } else if (match_option(option, "-Xint", &tail)) { | |
2452 set_mode_flags(_int); | |
2453 // -Xmixed | |
2454 } else if (match_option(option, "-Xmixed", &tail)) { | |
2455 set_mode_flags(_mixed); | |
2456 // -Xcomp | |
2457 } else if (match_option(option, "-Xcomp", &tail)) { | |
2458 // for testing the compiler; turn off all flags that inhibit compilation | |
2459 set_mode_flags(_comp); | |
2460 | |
2461 // -Xshare:dump | |
2462 } else if (match_option(option, "-Xshare:dump", &tail)) { | |
2463 #ifdef TIERED | |
2464 FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true); | |
2465 set_mode_flags(_int); // Prevent compilation, which creates objects | |
2466 #elif defined(COMPILER2) | |
2467 vm_exit_during_initialization( | |
2468 "Dumping a shared archive is not supported on the Server JVM.", NULL); | |
2469 #elif defined(KERNEL) | |
2470 vm_exit_during_initialization( | |
2471 "Dumping a shared archive is not supported on the Kernel JVM.", NULL); | |
2472 #else | |
2473 FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true); | |
2474 set_mode_flags(_int); // Prevent compilation, which creates objects | |
2475 #endif | |
2476 // -Xshare:on | |
2477 } else if (match_option(option, "-Xshare:on", &tail)) { | |
2478 FLAG_SET_CMDLINE(bool, UseSharedSpaces, true); | |
2479 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, true); | |
2480 // -Xshare:auto | |
2481 } else if (match_option(option, "-Xshare:auto", &tail)) { | |
2482 FLAG_SET_CMDLINE(bool, UseSharedSpaces, true); | |
2483 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false); | |
2484 // -Xshare:off | |
2485 } else if (match_option(option, "-Xshare:off", &tail)) { | |
2486 FLAG_SET_CMDLINE(bool, UseSharedSpaces, false); | |
2487 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false); | |
2488 | |
2489 // -Xverify | |
2490 } else if (match_option(option, "-Xverify", &tail)) { | |
2491 if (strcmp(tail, ":all") == 0 || strcmp(tail, "") == 0) { | |
2492 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, true); | |
2493 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, true); | |
2494 } else if (strcmp(tail, ":remote") == 0) { | |
2495 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, false); | |
2496 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, true); | |
2497 } else if (strcmp(tail, ":none") == 0) { | |
2498 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, false); | |
2499 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, false); | |
2500 } else if (is_bad_option(option, args->ignoreUnrecognized, "verification")) { | |
2501 return JNI_EINVAL; | |
2502 } | |
2503 // -Xdebug | |
2504 } else if (match_option(option, "-Xdebug", &tail)) { | |
2505 // note this flag has been used, then ignore | |
2506 set_xdebug_mode(true); | |
2507 // -Xnoagent | |
2508 } else if (match_option(option, "-Xnoagent", &tail)) { | |
2509 // For compatibility with classic. HotSpot refuses to load the old style agent.dll. | |
2510 } else if (match_option(option, "-Xboundthreads", &tail)) { | |
2511 // Bind user level threads to kernel threads (Solaris only) | |
2512 FLAG_SET_CMDLINE(bool, UseBoundThreads, true); | |
2513 } else if (match_option(option, "-Xloggc:", &tail)) { | |
2514 // Redirect GC output to the file. -Xloggc:<filename> | |
2515 // ostream_init_log(), when called will use this filename | |
2516 // to initialize a fileStream. | |
2517 _gc_log_filename = strdup(tail); | |
2518 FLAG_SET_CMDLINE(bool, PrintGC, true); | |
2519 FLAG_SET_CMDLINE(bool, PrintGCTimeStamps, true); | |
2520 | |
2521 // JNI hooks | |
2522 } else if (match_option(option, "-Xcheck", &tail)) { | |
2523 if (!strcmp(tail, ":jni")) { | |
2524 CheckJNICalls = true; | |
2525 } else if (is_bad_option(option, args->ignoreUnrecognized, | |
2526 "check")) { | |
2527 return JNI_EINVAL; | |
2528 } | |
2529 } else if (match_option(option, "vfprintf", &tail)) { | |
2530 _vfprintf_hook = CAST_TO_FN_PTR(vfprintf_hook_t, option->extraInfo); | |
2531 } else if (match_option(option, "exit", &tail)) { | |
2532 _exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo); | |
2533 } else if (match_option(option, "abort", &tail)) { | |
2534 _abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo); | |
2535 // -XX:+AggressiveHeap | |
2536 } else if (match_option(option, "-XX:+AggressiveHeap", &tail)) { | |
2537 | |
2538 // This option inspects the machine and attempts to set various | |
2539 // parameters to be optimal for long-running, memory allocation | |
2540 // intensive jobs. It is intended for machines with large | |
2541 // amounts of cpu and memory. | |
2542 | |
2543 // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit | |
2544 // VM, but we may not be able to represent the total physical memory | |
2545 // available (like having 8gb of memory on a box but using a 32bit VM). | |
2546 // Thus, we need to make sure we're using a julong for intermediate | |
2547 // calculations. | |
2548 julong initHeapSize; | |
2549 julong total_memory = os::physical_memory(); | |
2550 | |
2551 if (total_memory < (julong)256*M) { | |
2552 jio_fprintf(defaultStream::error_stream(), | |
2553 "You need at least 256mb of memory to use -XX:+AggressiveHeap\n"); | |
2554 vm_exit(1); | |
2555 } | |
2556 | |
2557 // The heap size is half of available memory, or (at most) | |
2558 // all of possible memory less 160mb (leaving room for the OS | |
2559 // when using ISM). This is the maximum; because adaptive sizing | |
2560 // is turned on below, the actual space used may be smaller. | |
2561 | |
2562 initHeapSize = MIN2(total_memory / (julong)2, | |
2563 total_memory - (julong)160*M); | |
2564 | |
2565 // Make sure that if we have a lot of memory we cap the 32 bit | |
2566 // process space. The 64bit VM version of this function is a nop. | |
2567 initHeapSize = os::allocatable_physical_memory(initHeapSize); | |
2568 | |
2569 // The perm gen is separate but contiguous with the | |
2570 // object heap (and is reserved with it) so subtract it | |
2571 // from the heap size. | |
2572 if (initHeapSize > MaxPermSize) { | |
2573 initHeapSize = initHeapSize - MaxPermSize; | |
2574 } else { | |
2575 warning("AggressiveHeap and MaxPermSize values may conflict"); | |
2576 } | |
2577 | |
2578 if (FLAG_IS_DEFAULT(MaxHeapSize)) { | |
2579 FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize); | |
1064 | 2580 FLAG_SET_CMDLINE(uintx, InitialHeapSize, initHeapSize); |
0 | 2581 // Currently the minimum size and the initial heap sizes are the same. |
1064 | 2582 set_min_heap_size(initHeapSize); |
0 | 2583 } |
2584 if (FLAG_IS_DEFAULT(NewSize)) { | |
2585 // Make the young generation 3/8ths of the total heap. | |
2586 FLAG_SET_CMDLINE(uintx, NewSize, | |
2587 ((julong)MaxHeapSize / (julong)8) * (julong)3); | |
2588 FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize); | |
2589 } | |
2590 | |
2591 FLAG_SET_DEFAULT(UseLargePages, true); | |
2592 | |
2593 // Increase some data structure sizes for efficiency | |
2594 FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize); | |
2595 FLAG_SET_CMDLINE(bool, ResizeTLAB, false); | |
2596 FLAG_SET_CMDLINE(uintx, TLABSize, 256*K); | |
2597 | |
2598 // See the OldPLABSize comment below, but replace 'after promotion' | |
2599 // with 'after copying'. YoungPLABSize is the size of the survivor | |
2600 // space per-gc-thread buffers. The default is 4kw. | |
2601 FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256*K); // Note: this is in words | |
2602 | |
2603 // OldPLABSize is the size of the buffers in the old gen that | |
2604 // UseParallelGC uses to promote live data that doesn't fit in the | |
2605 // survivor spaces. At any given time, there's one for each gc thread. | |
2606 // The default size is 1kw. These buffers are rarely used, since the | |
2607 // survivor spaces are usually big enough. For specjbb, however, there | |
2608 // are occasions when there's lots of live data in the young gen | |
2609 // and we end up promoting some of it. We don't have a definite | |
2610 // explanation for why bumping OldPLABSize helps, but the theory | |
2611 // is that a bigger PLAB results in retaining something like the | |
2612 // original allocation order after promotion, which improves mutator | |
2613 // locality. A minor effect may be that larger PLABs reduce the | |
2614 // number of PLAB allocation events during gc. The value of 8kw | |
2615 // was arrived at by experimenting with specjbb. | |
2616 FLAG_SET_CMDLINE(uintx, OldPLABSize, 8*K); // Note: this is in words | |
2617 | |
2618 // CompilationPolicyChoice=0 causes the server compiler to adopt | |
2619 // a more conservative which-method-do-I-compile policy when one | |
2620 // of the counters maintained by the interpreter trips. The | |
2621 // result is reduced startup time and improved specjbb and | |
2622 // alacrity performance. Zero is the default, but we set it | |
2623 // explicitly here in case the default changes. | |
2624 // See runtime/compilationPolicy.*. | |
2625 FLAG_SET_CMDLINE(intx, CompilationPolicyChoice, 0); | |
2626 | |
2627 // Enable parallel GC and adaptive generation sizing | |
2628 FLAG_SET_CMDLINE(bool, UseParallelGC, true); | |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
2629 FLAG_SET_DEFAULT(ParallelGCThreads, |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
2630 Abstract_VM_Version::parallel_worker_threads()); |
0 | 2631 |
2632 // Encourage steady state memory management | |
2633 FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100); | |
2634 | |
2635 // This appears to improve mutator locality | |
2636 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); | |
2637 | |
2638 // Get around early Solaris scheduling bug | |
2639 // (affinity vs other jobs on system) | |
2640 // but disallow DR and offlining (5008695). | |
2641 FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true); | |
2642 | |
2643 } else if (match_option(option, "-XX:+NeverTenure", &tail)) { | |
2644 // The last option must always win. | |
2645 FLAG_SET_CMDLINE(bool, AlwaysTenure, false); | |
2646 FLAG_SET_CMDLINE(bool, NeverTenure, true); | |
2647 } else if (match_option(option, "-XX:+AlwaysTenure", &tail)) { | |
2648 // The last option must always win. | |
2649 FLAG_SET_CMDLINE(bool, NeverTenure, false); | |
2650 FLAG_SET_CMDLINE(bool, AlwaysTenure, true); | |
2651 } else if (match_option(option, "-XX:+CMSPermGenSweepingEnabled", &tail) || | |
2652 match_option(option, "-XX:-CMSPermGenSweepingEnabled", &tail)) { | |
2653 jio_fprintf(defaultStream::error_stream(), | |
2654 "Please use CMSClassUnloadingEnabled in place of " | |
2655 "CMSPermGenSweepingEnabled in the future\n"); | |
2656 } else if (match_option(option, "-XX:+UseGCTimeLimit", &tail)) { | |
2657 FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, true); | |
2658 jio_fprintf(defaultStream::error_stream(), | |
2659 "Please use -XX:+UseGCOverheadLimit in place of " | |
2660 "-XX:+UseGCTimeLimit in the future\n"); | |
2661 } else if (match_option(option, "-XX:-UseGCTimeLimit", &tail)) { | |
2662 FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, false); | |
2663 jio_fprintf(defaultStream::error_stream(), | |
2664 "Please use -XX:-UseGCOverheadLimit in place of " | |
2665 "-XX:-UseGCTimeLimit in the future\n"); | |
2666 // The TLE options are for compatibility with 1.3 and will be | |
2667 // removed without notice in a future release. These options | |
2668 // are not to be documented. | |
2669 } else if (match_option(option, "-XX:MaxTLERatio=", &tail)) { | |
2670 // No longer used. | |
2671 } else if (match_option(option, "-XX:+ResizeTLE", &tail)) { | |
2672 FLAG_SET_CMDLINE(bool, ResizeTLAB, true); | |
2673 } else if (match_option(option, "-XX:-ResizeTLE", &tail)) { | |
2674 FLAG_SET_CMDLINE(bool, ResizeTLAB, false); | |
2675 } else if (match_option(option, "-XX:+PrintTLE", &tail)) { | |
2676 FLAG_SET_CMDLINE(bool, PrintTLAB, true); | |
2677 } else if (match_option(option, "-XX:-PrintTLE", &tail)) { | |
2678 FLAG_SET_CMDLINE(bool, PrintTLAB, false); | |
2679 } else if (match_option(option, "-XX:TLEFragmentationRatio=", &tail)) { | |
2680 // No longer used. | |
2681 } else if (match_option(option, "-XX:TLESize=", &tail)) { | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2682 julong long_tlab_size = 0; |
0 | 2683 ArgsRange errcode = parse_memory_size(tail, &long_tlab_size, 1); |
2684 if (errcode != arg_in_range) { | |
2685 jio_fprintf(defaultStream::error_stream(), | |
2686 "Invalid TLAB size: %s\n", option->optionString); | |
2687 describe_range_error(errcode); | |
2688 return JNI_EINVAL; | |
2689 } | |
2690 FLAG_SET_CMDLINE(uintx, TLABSize, long_tlab_size); | |
2691 } else if (match_option(option, "-XX:TLEThreadRatio=", &tail)) { | |
2692 // No longer used. | |
2693 } else if (match_option(option, "-XX:+UseTLE", &tail)) { | |
2694 FLAG_SET_CMDLINE(bool, UseTLAB, true); | |
2695 } else if (match_option(option, "-XX:-UseTLE", &tail)) { | |
2696 FLAG_SET_CMDLINE(bool, UseTLAB, false); | |
2697 SOLARIS_ONLY( | |
2698 } else if (match_option(option, "-XX:+UsePermISM", &tail)) { | |
2699 warning("-XX:+UsePermISM is obsolete."); | |
2700 FLAG_SET_CMDLINE(bool, UseISM, true); | |
2701 } else if (match_option(option, "-XX:-UsePermISM", &tail)) { | |
2702 FLAG_SET_CMDLINE(bool, UseISM, false); | |
2703 ) | |
2704 } else if (match_option(option, "-XX:+DisplayVMOutputToStderr", &tail)) { | |
2705 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, false); | |
2706 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, true); | |
2707 } else if (match_option(option, "-XX:+DisplayVMOutputToStdout", &tail)) { | |
2708 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, false); | |
2709 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, true); | |
2710 } else if (match_option(option, "-XX:+ExtendedDTraceProbes", &tail)) { | |
4006 | 2711 #if defined(DTRACE_ENABLED) |
0 | 2712 FLAG_SET_CMDLINE(bool, ExtendedDTraceProbes, true); |
2713 FLAG_SET_CMDLINE(bool, DTraceMethodProbes, true); | |
2714 FLAG_SET_CMDLINE(bool, DTraceAllocProbes, true); | |
2715 FLAG_SET_CMDLINE(bool, DTraceMonitorProbes, true); | |
4006 | 2716 #else // defined(DTRACE_ENABLED) |
0 | 2717 jio_fprintf(defaultStream::error_stream(), |
4006 | 2718 "ExtendedDTraceProbes flag is not applicable for this configuration\n"); |
0 | 2719 return JNI_EINVAL; |
4006 | 2720 #endif // defined(DTRACE_ENABLED) |
0 | 2721 #ifdef ASSERT |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2722 } else if (match_option(option, "-XX:+FullGCALot", &tail)) { |
0 | 2723 FLAG_SET_CMDLINE(bool, FullGCALot, true); |
2724 // disable scavenge before parallel mark-compact | |
2725 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); | |
2726 #endif | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2727 } else if (match_option(option, "-XX:CMSParPromoteBlocksToClaim=", &tail)) { |
0 | 2728 julong cms_blocks_to_claim = (julong)atol(tail); |
2729 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim); | |
2730 jio_fprintf(defaultStream::error_stream(), | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2731 "Please use -XX:OldPLABSize in place of " |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2732 "-XX:CMSParPromoteBlocksToClaim in the future\n"); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2733 } else if (match_option(option, "-XX:ParCMSPromoteBlocksToClaim=", &tail)) { |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2734 julong cms_blocks_to_claim = (julong)atol(tail); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2735 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim); |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2736 jio_fprintf(defaultStream::error_stream(), |
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2737 "Please use -XX:OldPLABSize in place of " |
0 | 2738 "-XX:ParCMSPromoteBlocksToClaim in the future\n"); |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2739 } else if (match_option(option, "-XX:ParallelGCOldGenAllocBufferSize=", &tail)) { |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2740 julong old_plab_size = 0; |
0 | 2741 ArgsRange errcode = parse_memory_size(tail, &old_plab_size, 1); |
2742 if (errcode != arg_in_range) { | |
2743 jio_fprintf(defaultStream::error_stream(), | |
2744 "Invalid old PLAB size: %s\n", option->optionString); | |
2745 describe_range_error(errcode); | |
2746 return JNI_EINVAL; | |
2747 } | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2748 FLAG_SET_CMDLINE(uintx, OldPLABSize, old_plab_size); |
0 | 2749 jio_fprintf(defaultStream::error_stream(), |
2750 "Please use -XX:OldPLABSize in place of " | |
2751 "-XX:ParallelGCOldGenAllocBufferSize in the future\n"); | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2752 } else if (match_option(option, "-XX:ParallelGCToSpaceAllocBufferSize=", &tail)) { |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2753 julong young_plab_size = 0; |
0 | 2754 ArgsRange errcode = parse_memory_size(tail, &young_plab_size, 1); |
2755 if (errcode != arg_in_range) { | |
2756 jio_fprintf(defaultStream::error_stream(), | |
2757 "Invalid young PLAB size: %s\n", option->optionString); | |
2758 describe_range_error(errcode); | |
2759 return JNI_EINVAL; | |
2760 } | |
489
2494ab195856
6653214: MemoryPoolMXBean.setUsageThreshold() does not support large heap sizes.
swamyv
parents:
483
diff
changeset
|
2761 FLAG_SET_CMDLINE(uintx, YoungPLABSize, young_plab_size); |
0 | 2762 jio_fprintf(defaultStream::error_stream(), |
2763 "Please use -XX:YoungPLABSize in place of " | |
2764 "-XX:ParallelGCToSpaceAllocBufferSize in the future\n"); | |
1284 | 2765 } else if (match_option(option, "-XX:CMSMarkStackSize=", &tail) || |
2766 match_option(option, "-XX:G1MarkStackSize=", &tail)) { | |
2767 julong stack_size = 0; | |
2768 ArgsRange errcode = parse_memory_size(tail, &stack_size, 1); | |
2769 if (errcode != arg_in_range) { | |
2770 jio_fprintf(defaultStream::error_stream(), | |
2771 "Invalid mark stack size: %s\n", option->optionString); | |
2772 describe_range_error(errcode); | |
2773 return JNI_EINVAL; | |
2774 } | |
2775 FLAG_SET_CMDLINE(uintx, MarkStackSize, stack_size); | |
2776 } else if (match_option(option, "-XX:CMSMarkStackSizeMax=", &tail)) { | |
2777 julong max_stack_size = 0; | |
2778 ArgsRange errcode = parse_memory_size(tail, &max_stack_size, 1); | |
2779 if (errcode != arg_in_range) { | |
2780 jio_fprintf(defaultStream::error_stream(), | |
2781 "Invalid maximum mark stack size: %s\n", | |
2782 option->optionString); | |
2783 describe_range_error(errcode); | |
2784 return JNI_EINVAL; | |
2785 } | |
2786 FLAG_SET_CMDLINE(uintx, MarkStackSizeMax, max_stack_size); | |
2787 } else if (match_option(option, "-XX:ParallelMarkingThreads=", &tail) || | |
2788 match_option(option, "-XX:ParallelCMSThreads=", &tail)) { | |
2789 uintx conc_threads = 0; | |
2790 if (!parse_uintx(tail, &conc_threads, 1)) { | |
2791 jio_fprintf(defaultStream::error_stream(), | |
2792 "Invalid concurrent threads: %s\n", option->optionString); | |
2793 return JNI_EINVAL; | |
2794 } | |
2795 FLAG_SET_CMDLINE(uintx, ConcGCThreads, conc_threads); | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
2796 } else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx |
0 | 2797 // Skip -XX:Flags= since that case has already been handled |
2798 if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) { | |
2799 if (!process_argument(tail, args->ignoreUnrecognized, origin)) { | |
2800 return JNI_EINVAL; | |
2801 } | |
2802 } | |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2803 } |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2804 #ifdef GRAAL |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2805 else if (match_option(option, "-G:", &tail)) { // -G:XXX |
2891
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
2806 // Option for the graal compiler. |
1437
9e5e83ca2259
Enabled -C1X:OPTIONS when running HotSpot/C1X. Enabled checkstyle for the HotSpotVM Java project.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
1356
diff
changeset
|
2807 if (PrintVMOptions) { |
2891
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
2808 tty->print_cr("graal option %s", tail); |
1437
9e5e83ca2259
Enabled -C1X:OPTIONS when running HotSpot/C1X. Enabled checkstyle for the HotSpotVM Java project.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
1356
diff
changeset
|
2809 } |
2891
75a99b4f1c98
Rebranded C++ part from C1X to Graal.
Thomas Wuerthinger <thomas@wuerthinger.net>
parents:
2873
diff
changeset
|
2810 Arguments::add_graal_arg(tail); |
1437
9e5e83ca2259
Enabled -C1X:OPTIONS when running HotSpot/C1X. Enabled checkstyle for the HotSpotVM Java project.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents:
1356
diff
changeset
|
2811 |
0 | 2812 // Unknown option |
4559
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2813 } |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2814 #endif |
723df37192d6
Make it possible again to build a real client libjvm, drop the UseGraal flag.
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
4350
diff
changeset
|
2815 else if (is_bad_option(option, args->ignoreUnrecognized)) { |
0 | 2816 return JNI_ERR; |
2817 } | |
2818 } | |
3767
2a241e764894
6941923: RFE: Handling large log files produced by long running Java Applications
minqi
parents:
3349
diff
changeset
|
2819 |
449
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2820 // Change the default value for flags which have different default values |
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2821 // when working with older JDKs. |
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2822 if (JDK_Version::current().compare_major(6) <= 0 && |
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2823 FLAG_IS_DEFAULT(UseVMInterruptibleIO)) { |
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2824 FLAG_SET_DEFAULT(UseVMInterruptibleIO, true); |
171e581e8161
6554406: Change switch UseVMInterruptibleIO default to false (sol)
xlu
parents:
420
diff
changeset
|
2825 } |
1679
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2826 #ifdef LINUX |
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2827 if (JDK_Version::current().compare_major(6) <= 0 && |
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2828 FLAG_IS_DEFAULT(UseLinuxPosixThreadCPUClocks)) { |
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2829 FLAG_SET_DEFAULT(UseLinuxPosixThreadCPUClocks, false); |
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2830 } |
3d90023429ec
6888526: Linux getCurrentThreadCpuTime is drastically slower than Windows
aph
parents:
1628
diff
changeset
|
2831 #endif // LINUX |
0 | 2832 return JNI_OK; |
2833 } | |
2834 | |
2835 jint Arguments::finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required) { | |
2836 // This must be done after all -D arguments have been processed. | |
2837 scp_p->expand_endorsed(); | |
2838 | |
2839 if (scp_assembly_required || scp_p->get_endorsed() != NULL) { | |
2840 // Assemble the bootclasspath elements into the final path. | |
2841 Arguments::set_sysclasspath(scp_p->combined_path()); | |
2842 } | |
2843 | |
2844 // This must be done after all arguments have been processed. | |
2845 // java_compiler() true means set to "NONE" or empty. | |
2846 if (java_compiler() && !xdebug_mode()) { | |
2847 // For backwards compatibility, we switch to interpreted mode if | |
2848 // -Djava.compiler="NONE" or "" is specified AND "-Xdebug" was | |
2849 // not specified. | |
2850 set_mode_flags(_int); | |
2851 } | |
2852 if (CompileThreshold == 0) { | |
2853 set_mode_flags(_int); | |
2854 } | |
2855 | |
2856 #ifndef COMPILER2 | |
2857 // Don't degrade server performance for footprint | |
2858 if (FLAG_IS_DEFAULT(UseLargePages) && | |
2859 MaxHeapSize < LargePageHeapSizeThreshold) { | |
2860 // No need for large granularity pages w/small heaps. | |
2861 // Note that large pages are enabled/disabled for both the | |
2862 // Java heap and the code cache. | |
2863 FLAG_SET_DEFAULT(UseLargePages, false); | |
2864 SOLARIS_ONLY(FLAG_SET_DEFAULT(UseMPSS, false)); | |
2865 SOLARIS_ONLY(FLAG_SET_DEFAULT(UseISM, false)); | |
2866 } | |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
2867 |
1251
576e77447e3c
6923002: assert(false,"this call site should not be polymorphic")
kvn
parents:
1188
diff
changeset
|
2868 // Tiered compilation is undefined with C1. |
576e77447e3c
6923002: assert(false,"this call site should not be polymorphic")
kvn
parents:
1188
diff
changeset
|
2869 TieredCompilation = false; |
0 | 2870 #else |
2871 if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) { | |
2872 FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1); | |
2873 } | |
2874 #endif | |
2875 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2876 // If we are running in a headless jre, force java.awt.headless property |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2877 // to be true unless the property has already been set. |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2878 // Also allow the OS environment variable JAVA_AWT_HEADLESS to set headless state. |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2879 if (os::is_headless_jre()) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2880 const char* headless = Arguments::get_property("java.awt.headless"); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2881 if (headless == NULL) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2882 char envbuffer[128]; |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2883 if (!os::getenv("JAVA_AWT_HEADLESS", envbuffer, sizeof(envbuffer))) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2884 if (!add_property("java.awt.headless=true")) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2885 return JNI_ENOMEM; |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2886 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2887 } else { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2888 char buffer[256]; |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2889 strcpy(buffer, "java.awt.headless="); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2890 strcat(buffer, envbuffer); |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2891 if (!add_property(buffer)) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2892 return JNI_ENOMEM; |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2893 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2894 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2895 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2896 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
2897 |
0 | 2898 if (!check_vm_args_consistency()) { |
2899 return JNI_ERR; | |
2900 } | |
2901 | |
2902 return JNI_OK; | |
2903 } | |
2904 | |
2905 jint Arguments::parse_java_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) { | |
2906 return parse_options_environment_variable("_JAVA_OPTIONS", scp_p, | |
2907 scp_assembly_required_p); | |
2908 } | |
2909 | |
2910 jint Arguments::parse_java_tool_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) { | |
2911 return parse_options_environment_variable("JAVA_TOOL_OPTIONS", scp_p, | |
2912 scp_assembly_required_p); | |
2913 } | |
2914 | |
2915 jint Arguments::parse_options_environment_variable(const char* name, SysClassPath* scp_p, bool* scp_assembly_required_p) { | |
2916 const int N_MAX_OPTIONS = 64; | |
2917 const int OPTION_BUFFER_SIZE = 1024; | |
2918 char buffer[OPTION_BUFFER_SIZE]; | |
2919 | |
2920 // The variable will be ignored if it exceeds the length of the buffer. | |
2921 // Don't check this variable if user has special privileges | |
2922 // (e.g. unix su command). | |
2923 if (os::getenv(name, buffer, sizeof(buffer)) && | |
2924 !os::have_special_privileges()) { | |
2925 JavaVMOption options[N_MAX_OPTIONS]; // Construct option array | |
2926 jio_fprintf(defaultStream::error_stream(), | |
2927 "Picked up %s: %s\n", name, buffer); | |
2928 char* rd = buffer; // pointer to the input string (rd) | |
2929 int i; | |
2930 for (i = 0; i < N_MAX_OPTIONS;) { // repeat for all options in the input string | |
2931 while (isspace(*rd)) rd++; // skip whitespace | |
2932 if (*rd == 0) break; // we re done when the input string is read completely | |
2933 | |
2934 // The output, option string, overwrites the input string. | |
2935 // Because of quoting, the pointer to the option string (wrt) may lag the pointer to | |
2936 // input string (rd). | |
2937 char* wrt = rd; | |
2938 | |
2939 options[i++].optionString = wrt; // Fill in option | |
2940 while (*rd != 0 && !isspace(*rd)) { // unquoted strings terminate with a space or NULL | |
2941 if (*rd == '\'' || *rd == '"') { // handle a quoted string | |
2942 int quote = *rd; // matching quote to look for | |
2943 rd++; // don't copy open quote | |
2944 while (*rd != quote) { // include everything (even spaces) up until quote | |
2945 if (*rd == 0) { // string termination means unmatched string | |
2946 jio_fprintf(defaultStream::error_stream(), | |
2947 "Unmatched quote in %s\n", name); | |
2948 return JNI_ERR; | |
2949 } | |
2950 *wrt++ = *rd++; // copy to option string | |
2951 } | |
2952 rd++; // don't copy close quote | |
2953 } else { | |
2954 *wrt++ = *rd++; // copy to option string | |
2955 } | |
2956 } | |
2957 // Need to check if we're done before writing a NULL, | |
2958 // because the write could be to the byte that rd is pointing to. | |
2959 if (*rd++ == 0) { | |
2960 *wrt = 0; | |
2961 break; | |
2962 } | |
2963 *wrt = 0; // Zero terminate option | |
2964 } | |
2965 // Construct JavaVMInitArgs structure and parse as if it was part of the command line | |
2966 JavaVMInitArgs vm_args; | |
2967 vm_args.version = JNI_VERSION_1_2; | |
2968 vm_args.options = options; | |
2969 vm_args.nOptions = i; | |
564 | 2970 vm_args.ignoreUnrecognized = IgnoreUnrecognizedVMOptions; |
0 | 2971 |
2972 if (PrintVMOptions) { | |
2973 const char* tail; | |
2974 for (int i = 0; i < vm_args.nOptions; i++) { | |
2975 const JavaVMOption *option = vm_args.options + i; | |
2976 if (match_option(option, "-XX:", &tail)) { | |
2977 logOption(tail); | |
2978 } | |
2979 } | |
2980 } | |
2981 | |
2982 return(parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p, ENVIRON_VAR)); | |
2983 } | |
2984 return JNI_OK; | |
2985 } | |
2986 | |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
2987 void Arguments::set_shared_spaces_flags() { |
2378 | 2988 const bool must_share = DumpSharedSpaces || RequireSharedSpaces; |
2989 const bool might_share = must_share || UseSharedSpaces; | |
2990 | |
2991 // The string table is part of the shared archive so the size must match. | |
2992 if (!FLAG_IS_DEFAULT(StringTableSize)) { | |
2993 // Disable sharing. | |
2994 if (must_share) { | |
2995 warning("disabling shared archive %s because of non-default " | |
2996 "StringTableSize", DumpSharedSpaces ? "creation" : "use"); | |
2997 } | |
2998 if (might_share) { | |
2999 FLAG_SET_DEFAULT(DumpSharedSpaces, false); | |
3000 FLAG_SET_DEFAULT(RequireSharedSpaces, false); | |
3001 FLAG_SET_DEFAULT(UseSharedSpaces, false); | |
3002 } | |
3003 return; | |
3004 } | |
3005 | |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3006 // Check whether class data sharing settings conflict with GC, compressed oops |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3007 // or page size, and fix them up. Explicit sharing options override other |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3008 // settings. |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3009 const bool cannot_share = UseConcMarkSweepGC || CMSIncrementalMode || |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3010 UseG1GC || UseParNewGC || UseParallelGC || UseParallelOldGC || |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3011 UseCompressedOops || UseLargePages && FLAG_IS_CMDLINE(UseLargePages); |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3012 if (cannot_share) { |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3013 if (must_share) { |
2378 | 3014 warning("selecting serial gc and disabling large pages %s" |
3015 "because of %s", "" LP64_ONLY("and compressed oops "), | |
3016 DumpSharedSpaces ? "-Xshare:dump" : "-Xshare:on"); | |
3017 force_serial_gc(); | |
3018 FLAG_SET_CMDLINE(bool, UseLargePages, false); | |
3019 LP64_ONLY(FLAG_SET_CMDLINE(bool, UseCompressedOops, false)); | |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3020 } else { |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3021 if (UseSharedSpaces && Verbose) { |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3022 warning("turning off use of shared archive because of " |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3023 "choice of garbage collector or large pages"); |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3024 } |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3025 no_shared_spaces(); |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3026 } |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3027 } else if (UseLargePages && might_share) { |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3028 // Disable large pages to allow shared spaces. This is sub-optimal, since |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3029 // there may not even be a shared archive to use. |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3030 FLAG_SET_DEFAULT(UseLargePages, false); |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3031 } |
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3032 } |
1891
9de67bf4244d
6996136: VM crash in src/share/vm/runtime/virtualspace.cpp:424
iveresov
parents:
1890
diff
changeset
|
3033 |
3797
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3034 // Disable options not supported in this release, with a warning if they |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3035 // were explicitly requested on the command-line |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3036 #define UNSUPPORTED_OPTION(opt, description) \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3037 do { \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3038 if (opt) { \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3039 if (FLAG_IS_CMDLINE(opt)) { \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3040 warning(description " is disabled in this release."); \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3041 } \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3042 FLAG_SET_DEFAULT(opt, false); \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3043 } \ |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3044 } while(0) |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3045 |
0 | 3046 // Parse entry point called from JNI_CreateJavaVM |
3047 | |
3048 jint Arguments::parse(const JavaVMInitArgs* args) { | |
3049 | |
3050 // Sharing support | |
3051 // Construct the path to the archive | |
3052 char jvm_path[JVM_MAXPATHLEN]; | |
3053 os::jvm_path(jvm_path, sizeof(jvm_path)); | |
3054 #ifdef TIERED | |
3055 if (strstr(jvm_path, "client") != NULL) { | |
3056 force_client_mode = true; | |
3057 } | |
3058 #endif // TIERED | |
3059 char *end = strrchr(jvm_path, *os::file_separator()); | |
3060 if (end != NULL) *end = '\0'; | |
3061 char *shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(jvm_path) + | |
3062 strlen(os::file_separator()) + 20); | |
3063 if (shared_archive_path == NULL) return JNI_ENOMEM; | |
3064 strcpy(shared_archive_path, jvm_path); | |
3065 strcat(shared_archive_path, os::file_separator()); | |
3066 strcat(shared_archive_path, "classes"); | |
3067 DEBUG_ONLY(strcat(shared_archive_path, "_g");) | |
3068 strcat(shared_archive_path, ".jsa"); | |
3069 SharedArchivePath = shared_archive_path; | |
3070 | |
3071 // Remaining part of option string | |
3072 const char* tail; | |
3073 | |
3074 // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed. | |
3075 bool settings_file_specified = false; | |
564 | 3076 const char* flags_file; |
0 | 3077 int index; |
3078 for (index = 0; index < args->nOptions; index++) { | |
3079 const JavaVMOption *option = args->options + index; | |
3080 if (match_option(option, "-XX:Flags=", &tail)) { | |
564 | 3081 flags_file = tail; |
0 | 3082 settings_file_specified = true; |
3083 } | |
3084 if (match_option(option, "-XX:+PrintVMOptions", &tail)) { | |
3085 PrintVMOptions = true; | |
3086 } | |
253
b0fe4deeb9fb
6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents:
196
diff
changeset
|
3087 if (match_option(option, "-XX:-PrintVMOptions", &tail)) { |
b0fe4deeb9fb
6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents:
196
diff
changeset
|
3088 PrintVMOptions = false; |
b0fe4deeb9fb
6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
kvn
parents:
196
diff
changeset
|
3089 } |
564 | 3090 if (match_option(option, "-XX:+IgnoreUnrecognizedVMOptions", &tail)) { |
3091 IgnoreUnrecognizedVMOptions = true; | |
3092 } | |
3093 if (match_option(option, "-XX:-IgnoreUnrecognizedVMOptions", &tail)) { | |
3094 IgnoreUnrecognizedVMOptions = false; | |
3095 } | |
1150 | 3096 if (match_option(option, "-XX:+PrintFlagsInitial", &tail)) { |
3097 CommandLineFlags::printFlags(); | |
3098 vm_exit(0); | |
3099 } | |
1768
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3100 |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3101 #ifndef PRODUCT |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3102 if (match_option(option, "-XX:+PrintFlagsWithComments", &tail)) { |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3103 CommandLineFlags::printFlags(true); |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3104 vm_exit(0); |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3105 } |
6ee479178066
6979444: add command line option to print command line flags descriptions
ikrylov
parents:
1745
diff
changeset
|
3106 #endif |
564 | 3107 } |
3108 | |
3109 if (IgnoreUnrecognizedVMOptions) { | |
3110 // uncast const to modify the flag args->ignoreUnrecognized | |
3111 *(jboolean*)(&args->ignoreUnrecognized) = true; | |
3112 } | |
3113 | |
3114 // Parse specified settings file | |
3115 if (settings_file_specified) { | |
3116 if (!process_settings_file(flags_file, true, args->ignoreUnrecognized)) { | |
3117 return JNI_EINVAL; | |
3118 } | |
0 | 3119 } |
3120 | |
3121 // Parse default .hotspotrc settings file | |
3122 if (!settings_file_specified) { | |
3123 if (!process_settings_file(".hotspotrc", false, args->ignoreUnrecognized)) { | |
3124 return JNI_EINVAL; | |
3125 } | |
3126 } | |
3127 | |
3128 if (PrintVMOptions) { | |
3129 for (index = 0; index < args->nOptions; index++) { | |
3130 const JavaVMOption *option = args->options + index; | |
3131 if (match_option(option, "-XX:", &tail)) { | |
3132 logOption(tail); | |
3133 } | |
3134 } | |
3135 } | |
3136 | |
3137 // Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS | |
3138 jint result = parse_vm_init_args(args); | |
3139 if (result != JNI_OK) { | |
3140 return result; | |
3141 } | |
3142 | |
3797
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3143 #ifdef JAVASE_EMBEDDED |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3144 UNSUPPORTED_OPTION(UseG1GC, "G1 GC"); |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3145 #endif |
eb94b7226b7a
7061192: option handling adjustments for oracle and embedded builds
jcoomes
parents:
3769
diff
changeset
|
3146 |
0 | 3147 #ifndef PRODUCT |
3148 if (TraceBytecodesAt != 0) { | |
3149 TraceBytecodes = true; | |
3150 } | |
3151 if (CountCompiledCalls) { | |
3152 if (UseCounterDecay) { | |
3153 warning("UseCounterDecay disabled because CountCalls is set"); | |
3154 UseCounterDecay = false; | |
3155 } | |
3156 } | |
3157 #endif // PRODUCT | |
3158 | |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3159 // Transitional |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3160 if (EnableMethodHandles || AnonymousClasses) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3161 if (!EnableInvokeDynamic && !FLAG_IS_DEFAULT(EnableInvokeDynamic)) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3162 warning("EnableMethodHandles and AnonymousClasses are obsolete. Keeping EnableInvokeDynamic disabled."); |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3163 } else { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3164 EnableInvokeDynamic = true; |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
712
diff
changeset
|
3165 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
712
diff
changeset
|
3166 } |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3167 |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3168 // JSR 292 is not supported before 1.7 |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3169 if (!JDK_Version::is_gte_jdk17x_version()) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3170 if (EnableInvokeDynamic) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3171 if (!FLAG_IS_DEFAULT(EnableInvokeDynamic)) { |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3172 warning("JSR 292 is not supported before 1.7. Disabling support."); |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3173 } |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3174 EnableInvokeDynamic = false; |
710 | 3175 } |
3176 } | |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3177 |
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3178 if (EnableInvokeDynamic && ScavengeRootsInCode == 0) { |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
932
diff
changeset
|
3179 if (!FLAG_IS_DEFAULT(ScavengeRootsInCode)) { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2378
diff
changeset
|
3180 warning("forcing ScavengeRootsInCode non-zero because EnableInvokeDynamic is true"); |
989
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
932
diff
changeset
|
3181 } |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
932
diff
changeset
|
3182 ScavengeRootsInCode = 1; |
148e5441d916
6863023: need non-perm oops in code cache for JSR 292
jrose
parents:
932
diff
changeset
|
3183 } |
2376
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3184 if (!JavaObjectsInPerm && ScavengeRootsInCode == 0) { |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3185 if (!FLAG_IS_DEFAULT(ScavengeRootsInCode)) { |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3186 warning("forcing ScavengeRootsInCode non-zero because JavaObjectsInPerm is false"); |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3187 } |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3188 ScavengeRootsInCode = 1; |
c7f3d0b4570f
7017732: move static fields into Class to prepare for perm gen removal
never
parents:
2370
diff
changeset
|
3189 } |
710 | 3190 |
0 | 3191 if (PrintGCDetails) { |
3192 // Turn on -verbose:gc options as well | |
3193 PrintGC = true; | |
3194 } | |
3195 | |
1571
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
3196 // Set object alignment values. |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
3197 set_object_alignment(); |
2d127394260e
6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents:
1506
diff
changeset
|
3198 |
0 | 3199 #ifdef SERIALGC |
1064 | 3200 force_serial_gc(); |
0 | 3201 #endif // SERIALGC |
3202 #ifdef KERNEL | |
3203 no_shared_spaces(); | |
3204 #endif // KERNEL | |
3205 | |
3206 // Set flags based on ergonomics. | |
3207 set_ergonomics_flags(); | |
3208 | |
2362
a2c2eac1ca62
7018056: large pages not always enabled by default
jcoomes
parents:
2302
diff
changeset
|
3209 set_shared_spaces_flags(); |
1135
e66fd840cb6b
6893081: method handle & invokedynamic code needs additional cleanup (post 6815692, 6858164)
twisti
parents:
1131
diff
changeset
|
3210 |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3211 // Check the GC selections again. |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3212 if (!check_gc_consistency()) { |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3213 return JNI_EINVAL; |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3214 } |
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3215 |
1783 | 3216 if (TieredCompilation) { |
3217 set_tiered_flags(); | |
3218 } else { | |
3219 // Check if the policy is valid. Policies 0 and 1 are valid for non-tiered setup. | |
3220 if (CompilationPolicyChoice >= 2) { | |
3221 vm_exit_during_initialization( | |
3222 "Incompatible compilation policy selected", NULL); | |
3223 } | |
3224 } | |
3225 | |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
3226 #ifndef KERNEL |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3227 // Set heap size based on available physical memory |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3228 set_heap_size(); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3229 // Set per-collector flags |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3230 if (UseParallelGC || UseParallelOldGC) { |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3231 set_parallel_gc_flags(); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3232 } else if (UseConcMarkSweepGC) { // should be done before ParNew check below |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3233 set_cms_and_parnew_gc_flags(); |
2368
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3234 } else if (UseParNewGC) { // skipped if CMS is set above |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3235 set_parnew_gc_flags(); |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3236 } else if (UseG1GC) { |
dde920245681
6896099: Integrate CMS heap ergo with default heap sizing ergo
ysr
parents:
2366
diff
changeset
|
3237 set_g1_gc_flags(); |
342
37f87013dfd8
6711316: Open source the Garbage-First garbage collector
ysr
parents:
135
diff
changeset
|
3238 } |
1145
e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
ysr
parents:
1074
diff
changeset
|
3239 #endif // KERNEL |
10
28372612af5e
6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents:
0
diff
changeset
|
3240 |
0 | 3241 #ifdef SERIALGC |
3242 assert(verify_serial_gc_flags(), "SerialGC unset"); | |
3243 #endif // SERIALGC | |
3244 | |
3245 // Set bytecode rewriting flags | |
3246 set_bytecode_flags(); | |
3247 | |
3248 // Set flags if Aggressive optimization flags (-XX:+AggressiveOpts) enabled. | |
3249 set_aggressive_opts_flags(); | |
3250 | |
2239
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3251 // Turn off biased locking for locking debug mode flags, |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3252 // which are subtlely different from each other but neither works with |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3253 // biased locking. |
2331 | 3254 if (UseHeavyMonitors |
3255 #ifdef COMPILER1 | |
3256 || !UseFastLocking | |
3257 #endif // COMPILER1 | |
3258 ) { | |
2239
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3259 if (!FLAG_IS_DEFAULT(UseBiasedLocking) && UseBiasedLocking) { |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3260 // flag set to true on command line; warn the user that they |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3261 // can't enable biased locking here |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3262 warning("Biased Locking is not supported with locking debug flags" |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3263 "; ignoring UseBiasedLocking flag." ); |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3264 } |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3265 UseBiasedLocking = false; |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3266 } |
c08677f98289
6840152: JVM crashes when heavyweight monitors are used
coleenp
parents:
2176
diff
changeset
|
3267 |
0 | 3268 #ifdef CC_INTERP |
1131 | 3269 // Clear flags not supported by the C++ interpreter |
3270 FLAG_SET_DEFAULT(ProfileInterpreter, false); | |
0 | 3271 FLAG_SET_DEFAULT(UseBiasedLocking, false); |
1131 | 3272 LP64_ONLY(FLAG_SET_DEFAULT(UseCompressedOops, false)); |
3273 #endif // CC_INTERP | |
3274 | |
420
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3275 #ifdef COMPILER2 |
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3276 if (!UseBiasedLocking || EmitSync != 0) { |
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3277 UseOptoBiasInlining = false; |
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3278 } |
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3279 #endif |
a1980da045cc
6462850: generate biased locking code in C2 ideal graph
kvn
parents:
416
diff
changeset
|
3280 |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1150
diff
changeset
|
3281 if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) { |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1150
diff
changeset
|
3282 warning("PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output"); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1150
diff
changeset
|
3283 DebugNonSafepoints = true; |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1150
diff
changeset
|
3284 } |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
1150
diff
changeset
|
3285 |
1188
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3286 #ifndef PRODUCT |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3287 if (CompileTheWorld) { |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3288 // Force NmethodSweeper to sweep whole CodeCache each time. |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3289 if (FLAG_IS_DEFAULT(NmethodSweepFraction)) { |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3290 NmethodSweepFraction = 1; |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3291 } |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3292 } |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3293 #endif |
99af867dfa05
6919886: Sweep CodeCache more aggressively to reduce its usage for CompileTheWorld
kvn
parents:
1161
diff
changeset
|
3294 |
0 | 3295 if (PrintCommandLineFlags) { |
3296 CommandLineFlags::printSetFlags(); | |
3297 } | |
3298 | |
1681
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3299 // Apply CPU specific policy for the BiasedLocking |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3300 if (UseBiasedLocking) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3301 if (!VM_Version::use_biased_locking() && |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3302 !(FLAG_IS_CMDLINE(UseBiasedLocking))) { |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3303 UseBiasedLocking = false; |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3304 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3305 } |
126ea7725993
6953477: Increase portability and flexibility of building Hotspot
bobv
parents:
1679
diff
changeset
|
3306 |
2302
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3307 // set PauseAtExit if the gamma launcher was used and a debugger is attached |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3308 // but only if not already set on the commandline |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3309 if (Arguments::created_by_gamma_launcher() && os::is_debugger_attached()) { |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3310 bool set = false; |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3311 CommandLineFlags::wasSetOnCmdline("PauseAtExit", &set); |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3312 if (!set) { |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3313 FLAG_SET_DEFAULT(PauseAtExit, true); |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3314 } |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3315 } |
da091bb67459
7022037: Pause when exiting if debugger is attached on windows
sla
parents:
2243
diff
changeset
|
3316 |
0 | 3317 return JNI_OK; |
3318 } | |
3319 | |
3320 int Arguments::PropertyList_count(SystemProperty* pl) { | |
3321 int count = 0; | |
3322 while(pl != NULL) { | |
3323 count++; | |
3324 pl = pl->next(); | |
3325 } | |
3326 return count; | |
3327 } | |
3328 | |
3329 const char* Arguments::PropertyList_get_value(SystemProperty *pl, const char* key) { | |
3330 assert(key != NULL, "just checking"); | |
3331 SystemProperty* prop; | |
3332 for (prop = pl; prop != NULL; prop = prop->next()) { | |
3333 if (strcmp(key, prop->key()) == 0) return prop->value(); | |
3334 } | |
3335 return NULL; | |
3336 } | |
3337 | |
3338 const char* Arguments::PropertyList_get_key_at(SystemProperty *pl, int index) { | |
3339 int count = 0; | |
3340 const char* ret_val = NULL; | |
3341 | |
3342 while(pl != NULL) { | |
3343 if(count >= index) { | |
3344 ret_val = pl->key(); | |
3345 break; | |
3346 } | |
3347 count++; | |
3348 pl = pl->next(); | |
3349 } | |
3350 | |
3351 return ret_val; | |
3352 } | |
3353 | |
3354 char* Arguments::PropertyList_get_value_at(SystemProperty* pl, int index) { | |
3355 int count = 0; | |
3356 char* ret_val = NULL; | |
3357 | |
3358 while(pl != NULL) { | |
3359 if(count >= index) { | |
3360 ret_val = pl->value(); | |
3361 break; | |
3362 } | |
3363 count++; | |
3364 pl = pl->next(); | |
3365 } | |
3366 | |
3367 return ret_val; | |
3368 } | |
3369 | |
3370 void Arguments::PropertyList_add(SystemProperty** plist, SystemProperty *new_p) { | |
3371 SystemProperty* p = *plist; | |
3372 if (p == NULL) { | |
3373 *plist = new_p; | |
3374 } else { | |
3375 while (p->next() != NULL) { | |
3376 p = p->next(); | |
3377 } | |
3378 p->set_next(new_p); | |
3379 } | |
3380 } | |
3381 | |
3382 void Arguments::PropertyList_add(SystemProperty** plist, const char* k, char* v) { | |
3383 if (plist == NULL) | |
3384 return; | |
3385 | |
3386 SystemProperty* new_p = new SystemProperty(k, v, true); | |
3387 PropertyList_add(plist, new_p); | |
3388 } | |
3389 | |
3390 // This add maintains unique property key in the list. | |
691 | 3391 void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, char* v, jboolean append) { |
0 | 3392 if (plist == NULL) |
3393 return; | |
3394 | |
3395 // If property key exist then update with new value. | |
3396 SystemProperty* prop; | |
3397 for (prop = *plist; prop != NULL; prop = prop->next()) { | |
3398 if (strcmp(k, prop->key()) == 0) { | |
691 | 3399 if (append) { |
3400 prop->append_value(v); | |
3401 } else { | |
3402 prop->set_value(v); | |
3403 } | |
0 | 3404 return; |
3405 } | |
3406 } | |
3407 | |
3408 PropertyList_add(plist, k, v); | |
3409 } | |
3410 | |
3411 #ifdef KERNEL | |
3412 char *Arguments::get_kernel_properties() { | |
3413 // Find properties starting with kernel and append them to string | |
3414 // We need to find out how long they are first because the URL's that they | |
3415 // might point to could get long. | |
3416 int length = 0; | |
3417 SystemProperty* prop; | |
3418 for (prop = _system_properties; prop != NULL; prop = prop->next()) { | |
3419 if (strncmp(prop->key(), "kernel.", 7 ) == 0) { | |
3420 length += (strlen(prop->key()) + strlen(prop->value()) + 5); // "-D =" | |
3421 } | |
3422 } | |
3423 // Add one for null terminator. | |
3424 char *props = AllocateHeap(length + 1, "get_kernel_properties"); | |
3425 if (length != 0) { | |
3426 int pos = 0; | |
3427 for (prop = _system_properties; prop != NULL; prop = prop->next()) { | |
3428 if (strncmp(prop->key(), "kernel.", 7 ) == 0) { | |
3429 jio_snprintf(&props[pos], length-pos, | |
3430 "-D%s=%s ", prop->key(), prop->value()); | |
3431 pos = strlen(props); | |
3432 } | |
3433 } | |
3434 } | |
3435 // null terminate props in case of null | |
3436 props[length] = '\0'; | |
3437 return props; | |
3438 } | |
3439 #endif // KERNEL | |
3440 | |
3441 // Copies src into buf, replacing "%%" with "%" and "%p" with pid | |
3442 // Returns true if all of the source pointed by src has been copied over to | |
3443 // the destination buffer pointed by buf. Otherwise, returns false. | |
3444 // Notes: | |
3445 // 1. If the length (buflen) of the destination buffer excluding the | |
3446 // NULL terminator character is not long enough for holding the expanded | |
3447 // pid characters, it also returns false instead of returning the partially | |
3448 // expanded one. | |
3449 // 2. The passed in "buflen" should be large enough to hold the null terminator. | |
3450 bool Arguments::copy_expand_pid(const char* src, size_t srclen, | |
3451 char* buf, size_t buflen) { | |
3452 const char* p = src; | |
3453 char* b = buf; | |
3454 const char* src_end = &src[srclen]; | |
3455 char* buf_end = &buf[buflen - 1]; | |
3456 | |
3457 while (p < src_end && b < buf_end) { | |
3458 if (*p == '%') { | |
3459 switch (*(++p)) { | |
3460 case '%': // "%%" ==> "%" | |
3461 *b++ = *p++; | |
3462 break; | |
3463 case 'p': { // "%p" ==> current process id | |
3464 // buf_end points to the character before the last character so | |
3465 // that we could write '\0' to the end of the buffer. | |
3466 size_t buf_sz = buf_end - b + 1; | |
3467 int ret = jio_snprintf(b, buf_sz, "%d", os::current_process_id()); | |
3468 | |
3469 // if jio_snprintf fails or the buffer is not long enough to hold | |
3470 // the expanded pid, returns false. | |
3471 if (ret < 0 || ret >= (int)buf_sz) { | |
3472 return false; | |
3473 } else { | |
3474 b += ret; | |
3475 assert(*b == '\0', "fail in copy_expand_pid"); | |
3476 if (p == src_end && b == buf_end + 1) { | |
3477 // reach the end of the buffer. | |
3478 return true; | |
3479 } | |
3480 } | |
3481 p++; | |
3482 break; | |
3483 } | |
3484 default : | |
3485 *b++ = '%'; | |
3486 } | |
3487 } else { | |
3488 *b++ = *p++; | |
3489 } | |
3490 } | |
3491 *b = '\0'; | |
3492 return (p == src_end); // return false if not all of the source was copied | |
3493 } |