annotate src/share/vm/runtime/arguments.cpp @ 94:0834225a7916

6634032: CMS: Need CMSInitiatingPermOccupancyFraction for perm, divorcing from CMSInitiatingOccupancyFraction Summary: The option CMSInitiatingPermOccupancyFraction now controls perm triggering threshold. Even though the actual value of the threshold has not yet been changed, so there is no change in policy, we now have the infrastructure in place for dynamically deciding when to collect the perm gen, an issue that will be addressed in the near future. Reviewed-by: jmasa
author ysr
date Sun, 16 Mar 2008 21:57:25 -0700
parents 183f41cf8bfe
children 8b6e49187640
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_arguments.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28 #define DEFAULT_VENDOR_URL_BUG "http://java.sun.com/webapps/bugreport/crash.jsp"
a61af66fc99e Initial load
duke
parents:
diff changeset
29 #define DEFAULT_JAVA_LAUNCHER "generic"
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 char** Arguments::_jvm_flags_array = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 int Arguments::_num_jvm_flags = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
33 char** Arguments::_jvm_args_array = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 int Arguments::_num_jvm_args = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 char* Arguments::_java_command = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 SystemProperty* Arguments::_system_properties = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 const char* Arguments::_gc_log_filename = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 bool Arguments::_has_profile = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 bool Arguments::_has_alloc_profile = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 uintx Arguments::_initial_heap_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 uintx Arguments::_min_heap_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Arguments::Mode Arguments::_mode = _mixed;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 bool Arguments::_java_compiler = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 bool Arguments::_xdebug_mode = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 const char* Arguments::_java_vendor_url_bug = DEFAULT_VENDOR_URL_BUG;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 const char* Arguments::_sun_java_launcher = DEFAULT_JAVA_LAUNCHER;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 int Arguments::_sun_java_launcher_pid = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // These parameters are reset in method parse_vm_init_args(JavaVMInitArgs*)
a61af66fc99e Initial load
duke
parents:
diff changeset
50 bool Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 bool Arguments::_UseOnStackReplacement = UseOnStackReplacement;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 bool Arguments::_BackgroundCompilation = BackgroundCompilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 bool Arguments::_ClipInlining = ClipInlining;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 intx Arguments::_Tier2CompileThreshold = Tier2CompileThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 char* Arguments::SharedArchivePath = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
57
a61af66fc99e Initial load
duke
parents:
diff changeset
58 AgentLibraryList Arguments::_libraryList;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 AgentLibraryList Arguments::_agentList;
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 abort_hook_t Arguments::_abort_hook = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 exit_hook_t Arguments::_exit_hook = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 vfprintf_hook_t Arguments::_vfprintf_hook = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 SystemProperty *Arguments::_java_ext_dirs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 SystemProperty *Arguments::_java_endorsed_dirs = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 SystemProperty *Arguments::_sun_boot_library_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 SystemProperty *Arguments::_java_library_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 SystemProperty *Arguments::_java_home = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 SystemProperty *Arguments::_java_class_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 SystemProperty *Arguments::_sun_boot_class_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74 char* Arguments::_meta_index_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 char* Arguments::_meta_index_dir = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
76
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static bool force_client_mode = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Check if head of 'option' matches 'name', and sets 'tail' remaining part of option string
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81 static bool match_option(const JavaVMOption *option, const char* name,
a61af66fc99e Initial load
duke
parents:
diff changeset
82 const char** tail) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 int len = (int)strlen(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if (strncmp(option->optionString, name, len) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 *tail = option->optionString + len;
a61af66fc99e Initial load
duke
parents:
diff changeset
86 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
87 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 static void logOption(const char* opt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if (PrintVMOptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 jio_fprintf(defaultStream::output_stream(), "VM option '%s'\n", opt);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Process java launcher properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void Arguments::process_sun_java_launcher_properties(JavaVMInitArgs* args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // See if sun.java.launcher or sun.java.launcher.pid is defined.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // Must do this before setting up other system properties,
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // as some of them may depend on launcher type.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 for (int index = 0; index < args->nOptions; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 const JavaVMOption* option = args->options + index;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 const char* tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 if (match_option(option, "-Dsun.java.launcher=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 process_java_launcher_argument(tail, option->extraInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111 if (match_option(option, "-Dsun.java.launcher.pid=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 _sun_java_launcher_pid = atoi(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // Initialize system properties key and value.
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void Arguments::init_system_properties() {
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.version", "1.0", false));
a61af66fc99e Initial load
duke
parents:
diff changeset
122 PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.name",
a61af66fc99e Initial load
duke
parents:
diff changeset
123 "Java Virtual Machine Specification", false));
a61af66fc99e Initial load
duke
parents:
diff changeset
124 PropertyList_add(&_system_properties, new SystemProperty("java.vm.specification.vendor",
a61af66fc99e Initial load
duke
parents:
diff changeset
125 "Sun Microsystems Inc.", false));
a61af66fc99e Initial load
duke
parents:
diff changeset
126 PropertyList_add(&_system_properties, new SystemProperty("java.vm.version", VM_Version::vm_release(), false));
a61af66fc99e Initial load
duke
parents:
diff changeset
127 PropertyList_add(&_system_properties, new SystemProperty("java.vm.name", VM_Version::vm_name(), false));
a61af66fc99e Initial load
duke
parents:
diff changeset
128 PropertyList_add(&_system_properties, new SystemProperty("java.vm.vendor", VM_Version::vm_vendor(), false));
a61af66fc99e Initial load
duke
parents:
diff changeset
129 PropertyList_add(&_system_properties, new SystemProperty("java.vm.info", VM_Version::vm_info_string(), true));
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // following are JVMTI agent writeable properties.
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // Properties values are set to NULL and they are
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // os specific they are initialized in os::init_system_properties_values().
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _java_ext_dirs = new SystemProperty("java.ext.dirs", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _java_endorsed_dirs = new SystemProperty("java.endorsed.dirs", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _sun_boot_library_path = new SystemProperty("sun.boot.library.path", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _java_library_path = new SystemProperty("java.library.path", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _java_home = new SystemProperty("java.home", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _sun_boot_class_path = new SystemProperty("sun.boot.class.path", NULL, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 _java_class_path = new SystemProperty("java.class.path", "", true);
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Add to System Property list.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 PropertyList_add(&_system_properties, _java_ext_dirs);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 PropertyList_add(&_system_properties, _java_endorsed_dirs);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 PropertyList_add(&_system_properties, _sun_boot_library_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 PropertyList_add(&_system_properties, _java_library_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
148 PropertyList_add(&_system_properties, _java_home);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 PropertyList_add(&_system_properties, _java_class_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
150 PropertyList_add(&_system_properties, _sun_boot_class_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // Set OS specific system properties values
a61af66fc99e Initial load
duke
parents:
diff changeset
153 os::init_system_properties_values();
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // String containing commands that will be ignored and cause a
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // warning to be issued. These commands should be accepted
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // for 1.6 but not 1.7. The string should be cleared at the
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // beginning of 1.7.
a61af66fc99e Initial load
duke
parents:
diff changeset
160 static const char* obsolete_jvm_flags_1_5_0[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 "UseTrainGC",
a61af66fc99e Initial load
duke
parents:
diff changeset
162 "UseSpecialLargeObjectHandling",
a61af66fc99e Initial load
duke
parents:
diff changeset
163 "UseOversizedCarHandling",
a61af66fc99e Initial load
duke
parents:
diff changeset
164 "TraceCarAllocation",
a61af66fc99e Initial load
duke
parents:
diff changeset
165 "PrintTrainGCProcessingStats",
a61af66fc99e Initial load
duke
parents:
diff changeset
166 "LogOfCarSpaceSize",
a61af66fc99e Initial load
duke
parents:
diff changeset
167 "OversizedCarThreshold",
a61af66fc99e Initial load
duke
parents:
diff changeset
168 "MinTickInterval",
a61af66fc99e Initial load
duke
parents:
diff changeset
169 "DefaultTickInterval",
a61af66fc99e Initial load
duke
parents:
diff changeset
170 "MaxTickInterval",
a61af66fc99e Initial load
duke
parents:
diff changeset
171 "DelayTickAdjustment",
a61af66fc99e Initial load
duke
parents:
diff changeset
172 "ProcessingToTenuringRatio",
a61af66fc99e Initial load
duke
parents:
diff changeset
173 "MinTrainLength",
a61af66fc99e Initial load
duke
parents:
diff changeset
174 0};
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 bool Arguments::made_obsolete_in_1_5_0(const char *s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 while (obsolete_jvm_flags_1_5_0[i] != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 // <flag>=xxx form
a61af66fc99e Initial load
duke
parents:
diff changeset
180 // [-|+]<flag> form
a61af66fc99e Initial load
duke
parents:
diff changeset
181 if ((strncmp(obsolete_jvm_flags_1_5_0[i], s,
a61af66fc99e Initial load
duke
parents:
diff changeset
182 strlen(obsolete_jvm_flags_1_5_0[i])) == 0) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
183 ((s[0] == '+' || s[0] == '-') &&
a61af66fc99e Initial load
duke
parents:
diff changeset
184 (strncmp(obsolete_jvm_flags_1_5_0[i], &s[1],
a61af66fc99e Initial load
duke
parents:
diff changeset
185 strlen(obsolete_jvm_flags_1_5_0[i])) == 0))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Constructs the system class path (aka boot class path) from the following
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // components, in order:
a61af66fc99e Initial load
duke
parents:
diff changeset
195 //
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // prefix // from -Xbootclasspath/p:...
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // endorsed // the expansion of -Djava.endorsed.dirs=...
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // base // from os::get_system_properties() or -Xbootclasspath=
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // suffix // from -Xbootclasspath/a:...
a61af66fc99e Initial load
duke
parents:
diff changeset
200 //
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // java.endorsed.dirs is a list of directories; any jar or zip files in the
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // directories are added to the sysclasspath just before the base.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 //
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // This could be AllStatic, but it isn't needed after argument processing is
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // complete.
a61af66fc99e Initial load
duke
parents:
diff changeset
206 class SysClassPath: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
208 SysClassPath(const char* base);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 ~SysClassPath();
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 inline void set_base(const char* base);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 inline void add_prefix(const char* prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 inline void add_suffix(const char* suffix);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 inline void reset_path(const char* base);
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 // Expand the jar/zip files in each directory listed by the java.endorsed.dirs
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // property. Must be called after all command-line arguments have been
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // processed (in particular, -Djava.endorsed.dirs=...) and before calling
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // combined_path().
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void expand_endorsed();
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 inline const char* get_base() const { return _items[_scp_base]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 inline const char* get_prefix() const { return _items[_scp_prefix]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 inline const char* get_suffix() const { return _items[_scp_suffix]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 inline const char* get_endorsed() const { return _items[_scp_endorsed]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // Combine all the components into a single c-heap-allocated string; caller
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // must free the string if/when no longer needed.
a61af66fc99e Initial load
duke
parents:
diff changeset
229 char* combined_path();
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Utility routines.
a61af66fc99e Initial load
duke
parents:
diff changeset
233 static char* add_to_path(const char* path, const char* str, bool prepend);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 static char* add_jars_to_path(char* path, const char* directory);
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 inline void reset_item_at(int index);
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Array indices for the items that make up the sysclasspath. All except the
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // base are allocated in the C heap and freed by this class.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 _scp_prefix, // from -Xbootclasspath/p:...
a61af66fc99e Initial load
duke
parents:
diff changeset
242 _scp_endorsed, // the expansion of -Djava.endorsed.dirs=...
a61af66fc99e Initial load
duke
parents:
diff changeset
243 _scp_base, // the default sysclasspath
a61af66fc99e Initial load
duke
parents:
diff changeset
244 _scp_suffix, // from -Xbootclasspath/a:...
a61af66fc99e Initial load
duke
parents:
diff changeset
245 _scp_nitems // the number of items, must be last.
a61af66fc99e Initial load
duke
parents:
diff changeset
246 };
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 const char* _items[_scp_nitems];
a61af66fc99e Initial load
duke
parents:
diff changeset
249 DEBUG_ONLY(bool _expansion_done;)
a61af66fc99e Initial load
duke
parents:
diff changeset
250 };
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 SysClassPath::SysClassPath(const char* base) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 memset(_items, 0, sizeof(_items));
a61af66fc99e Initial load
duke
parents:
diff changeset
254 _items[_scp_base] = base;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 DEBUG_ONLY(_expansion_done = false;)
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 SysClassPath::~SysClassPath() {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 // Free everything except the base.
a61af66fc99e Initial load
duke
parents:
diff changeset
260 for (int i = 0; i < _scp_nitems; ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 if (i != _scp_base) reset_item_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 DEBUG_ONLY(_expansion_done = false;)
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 inline void SysClassPath::set_base(const char* base) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 _items[_scp_base] = base;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 inline void SysClassPath::add_prefix(const char* prefix) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], prefix, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 inline void SysClassPath::add_suffix(const char* suffix) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _items[_scp_suffix] = add_to_path(_items[_scp_suffix], suffix, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 inline void SysClassPath::reset_item_at(int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 assert(index < _scp_nitems && index != _scp_base, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
280 if (_items[index] != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 FREE_C_HEAP_ARRAY(char, _items[index]);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 _items[index] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 inline void SysClassPath::reset_path(const char* base) {
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Clear the prefix and suffix.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 reset_item_at(_scp_prefix);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 reset_item_at(_scp_suffix);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 set_base(base);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 //------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void SysClassPath::expand_endorsed() {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 assert(_items[_scp_endorsed] == NULL, "can only be called once.");
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 const char* path = Arguments::get_property("java.endorsed.dirs");
a61af66fc99e Initial load
duke
parents:
diff changeset
299 if (path == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 path = Arguments::get_endorsed_dir();
a61af66fc99e Initial load
duke
parents:
diff changeset
301 assert(path != NULL, "no default for java.endorsed.dirs");
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 char* expanded_path = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 const char separator = *os::path_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
306 const char* const end = path + strlen(path);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 while (path < end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
308 const char* tmp_end = strchr(path, separator);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 if (tmp_end == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 expanded_path = add_jars_to_path(expanded_path, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 path = end;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 char* dirpath = NEW_C_HEAP_ARRAY(char, tmp_end - path + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 memcpy(dirpath, path, tmp_end - path);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 dirpath[tmp_end - path] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
316 expanded_path = add_jars_to_path(expanded_path, dirpath);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 FREE_C_HEAP_ARRAY(char, dirpath);
a61af66fc99e Initial load
duke
parents:
diff changeset
318 path = tmp_end + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
321 _items[_scp_endorsed] = expanded_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 DEBUG_ONLY(_expansion_done = true;)
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // Combine the bootclasspath elements, some of which may be null, into a single
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // c-heap-allocated string.
a61af66fc99e Initial load
duke
parents:
diff changeset
327 char* SysClassPath::combined_path() {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 assert(_items[_scp_base] != NULL, "empty default sysclasspath");
a61af66fc99e Initial load
duke
parents:
diff changeset
329 assert(_expansion_done, "must call expand_endorsed() first.");
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331 size_t lengths[_scp_nitems];
a61af66fc99e Initial load
duke
parents:
diff changeset
332 size_t total_len = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 const char separator = *os::path_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // Get the lengths.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
338 for (i = 0; i < _scp_nitems; ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 if (_items[i] != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
340 lengths[i] = strlen(_items[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // Include space for the separator char (or a NULL for the last item).
a61af66fc99e Initial load
duke
parents:
diff changeset
342 total_len += lengths[i] + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
343 }
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 assert(total_len > 0, "empty sysclasspath not allowed");
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // Copy the _items to a single string.
a61af66fc99e Initial load
duke
parents:
diff changeset
348 char* cp = NEW_C_HEAP_ARRAY(char, total_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 char* cp_tmp = cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 for (i = 0; i < _scp_nitems; ++i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
351 if (_items[i] != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 memcpy(cp_tmp, _items[i], lengths[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
353 cp_tmp += lengths[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
354 *cp_tmp++ = separator;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357 *--cp_tmp = '\0'; // Replace the extra separator.
a61af66fc99e Initial load
duke
parents:
diff changeset
358 return cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // Note: path must be c-heap-allocated (or NULL); it is freed if non-null.
a61af66fc99e Initial load
duke
parents:
diff changeset
362 char*
a61af66fc99e Initial load
duke
parents:
diff changeset
363 SysClassPath::add_to_path(const char* path, const char* str, bool prepend) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 char *cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 assert(str != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
367 if (path == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
368 size_t len = strlen(str) + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
369 cp = NEW_C_HEAP_ARRAY(char, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
370 memcpy(cp, str, len); // copy the trailing null
a61af66fc99e Initial load
duke
parents:
diff changeset
371 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 const char separator = *os::path_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 size_t old_len = strlen(path);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 size_t str_len = strlen(str);
a61af66fc99e Initial load
duke
parents:
diff changeset
375 size_t len = old_len + str_len + 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if (prepend) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 cp = NEW_C_HEAP_ARRAY(char, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 char* cp_tmp = cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 memcpy(cp_tmp, str, str_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
381 cp_tmp += str_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 *cp_tmp = separator;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 memcpy(++cp_tmp, path, old_len + 1); // copy the trailing null
a61af66fc99e Initial load
duke
parents:
diff changeset
384 FREE_C_HEAP_ARRAY(char, path);
a61af66fc99e Initial load
duke
parents:
diff changeset
385 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
386 cp = REALLOC_C_HEAP_ARRAY(char, path, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
387 char* cp_tmp = cp + old_len;
a61af66fc99e Initial load
duke
parents:
diff changeset
388 *cp_tmp = separator;
a61af66fc99e Initial load
duke
parents:
diff changeset
389 memcpy(++cp_tmp, str, str_len + 1); // copy the trailing null
a61af66fc99e Initial load
duke
parents:
diff changeset
390 }
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392 return cp;
a61af66fc99e Initial load
duke
parents:
diff changeset
393 }
a61af66fc99e Initial load
duke
parents:
diff changeset
394
a61af66fc99e Initial load
duke
parents:
diff changeset
395 // Scan the directory and append any jar or zip files found to path.
a61af66fc99e Initial load
duke
parents:
diff changeset
396 // Note: path must be c-heap-allocated (or NULL); it is freed if non-null.
a61af66fc99e Initial load
duke
parents:
diff changeset
397 char* SysClassPath::add_jars_to_path(char* path, const char* directory) {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 DIR* dir = os::opendir(directory);
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (dir == NULL) return path;
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 char dir_sep[2] = { '\0', '\0' };
a61af66fc99e Initial load
duke
parents:
diff changeset
402 size_t directory_len = strlen(directory);
a61af66fc99e Initial load
duke
parents:
diff changeset
403 const char fileSep = *os::file_separator();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 if (directory[directory_len - 1] != fileSep) dir_sep[0] = fileSep;
a61af66fc99e Initial load
duke
parents:
diff changeset
405
a61af66fc99e Initial load
duke
parents:
diff changeset
406 /* Scan the directory for jars/zips, appending them to path. */
a61af66fc99e Initial load
duke
parents:
diff changeset
407 struct dirent *entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 char *dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(directory));
a61af66fc99e Initial load
duke
parents:
diff changeset
409 while ((entry = os::readdir(dir, (dirent *) dbuf)) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 const char* name = entry->d_name;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 const char* ext = name + strlen(name) - 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
412 bool isJarOrZip = ext > name &&
a61af66fc99e Initial load
duke
parents:
diff changeset
413 (os::file_name_strcmp(ext, ".jar") == 0 ||
a61af66fc99e Initial load
duke
parents:
diff changeset
414 os::file_name_strcmp(ext, ".zip") == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 if (isJarOrZip) {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 char* jarpath = NEW_C_HEAP_ARRAY(char, directory_len + 2 + strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
417 sprintf(jarpath, "%s%s%s", directory, dir_sep, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 path = add_to_path(path, jarpath, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 FREE_C_HEAP_ARRAY(char, jarpath);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 FREE_C_HEAP_ARRAY(char, dbuf);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 os::closedir(dir);
a61af66fc99e Initial load
duke
parents:
diff changeset
424 return path;
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // Parses a memory size specification string.
a61af66fc99e Initial load
duke
parents:
diff changeset
428 static bool atomll(const char *s, jlong* result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
429 jlong n = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
430 int args_read = sscanf(s, os::jlong_format_specifier(), &n);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 if (args_read != 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
433 }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 while (*s != '\0' && isdigit(*s)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 s++;
a61af66fc99e Initial load
duke
parents:
diff changeset
436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // 4705540: illegal if more characters are found after the first non-digit
a61af66fc99e Initial load
duke
parents:
diff changeset
438 if (strlen(s) > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 switch (*s) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 case 'T': case 't':
a61af66fc99e Initial load
duke
parents:
diff changeset
443 *result = n * G * K;
a61af66fc99e Initial load
duke
parents:
diff changeset
444 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
445 case 'G': case 'g':
a61af66fc99e Initial load
duke
parents:
diff changeset
446 *result = n * G;
a61af66fc99e Initial load
duke
parents:
diff changeset
447 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
448 case 'M': case 'm':
a61af66fc99e Initial load
duke
parents:
diff changeset
449 *result = n * M;
a61af66fc99e Initial load
duke
parents:
diff changeset
450 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
451 case 'K': case 'k':
a61af66fc99e Initial load
duke
parents:
diff changeset
452 *result = n * K;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 case '\0':
a61af66fc99e Initial load
duke
parents:
diff changeset
455 *result = n;
a61af66fc99e Initial load
duke
parents:
diff changeset
456 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
457 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
458 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462 Arguments::ArgsRange Arguments::check_memory_size(jlong size, jlong min_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 if (size < min_size) return arg_too_small;
a61af66fc99e Initial load
duke
parents:
diff changeset
464 // Check that size will fit in a size_t (only relevant on 32-bit)
a61af66fc99e Initial load
duke
parents:
diff changeset
465 if ((julong) size > max_uintx) return arg_too_big;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 return arg_in_range;
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Describe an argument out of range error
a61af66fc99e Initial load
duke
parents:
diff changeset
470 void Arguments::describe_range_error(ArgsRange errcode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
471 switch(errcode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 case arg_too_big:
a61af66fc99e Initial load
duke
parents:
diff changeset
473 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
474 "The specified size exceeds the maximum "
a61af66fc99e Initial load
duke
parents:
diff changeset
475 "representable size.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
476 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
477 case arg_too_small:
a61af66fc99e Initial load
duke
parents:
diff changeset
478 case arg_unreadable:
a61af66fc99e Initial load
duke
parents:
diff changeset
479 case arg_in_range:
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // do nothing for now
a61af66fc99e Initial load
duke
parents:
diff changeset
481 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
483 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 return CommandLineFlags::boolAtPut(name, &value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
493 double v;
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (sscanf(value, "%lf", &v) != 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 if (CommandLineFlags::doubleAtPut(name, &v, origin)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
499 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
500 }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
502 }
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 jlong v;
a61af66fc99e Initial load
duke
parents:
diff changeset
507 intx intx_v;
a61af66fc99e Initial load
duke
parents:
diff changeset
508 bool is_neg = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // Check the sign first since atomll() parses only unsigned values.
a61af66fc99e Initial load
duke
parents:
diff changeset
510 if (*value == '-') {
a61af66fc99e Initial load
duke
parents:
diff changeset
511 if (!CommandLineFlags::intxAt(name, &intx_v)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 value++;
a61af66fc99e Initial load
duke
parents:
diff changeset
515 is_neg = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517 if (!atomll(value, &v)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
520 intx_v = (intx) v;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 if (is_neg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 intx_v = -intx_v;
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 if (CommandLineFlags::intxAtPut(name, &intx_v, origin)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
525 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
526 }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 uintx uintx_v = (uintx) v;
a61af66fc99e Initial load
duke
parents:
diff changeset
528 if (!is_neg && CommandLineFlags::uintxAtPut(name, &uintx_v, origin)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
a61af66fc99e Initial load
duke
parents:
diff changeset
531 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534
a61af66fc99e Initial load
duke
parents:
diff changeset
535 static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Contract: CommandLineFlags always returns a pointer that needs freeing.
a61af66fc99e Initial load
duke
parents:
diff changeset
538 FREE_C_HEAP_ARRAY(char, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
539 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
540 }
a61af66fc99e Initial load
duke
parents:
diff changeset
541
a61af66fc99e Initial load
duke
parents:
diff changeset
542 static bool append_to_string_flag(char* name, const char* new_value, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 const char* old_value = "";
a61af66fc99e Initial load
duke
parents:
diff changeset
544 if (!CommandLineFlags::ccstrAt(name, &old_value)) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
545 size_t old_len = old_value != NULL ? strlen(old_value) : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 size_t new_len = strlen(new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
547 const char* value;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 char* free_this_too = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
549 if (old_len == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 value = new_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 } else if (new_len == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
552 value = old_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
553 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 char* buf = NEW_C_HEAP_ARRAY(char, old_len + 1 + new_len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 // each new setting adds another LINE to the switch:
a61af66fc99e Initial load
duke
parents:
diff changeset
556 sprintf(buf, "%s\n%s", old_value, new_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
557 value = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 free_this_too = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 }
a61af66fc99e Initial load
duke
parents:
diff changeset
560 (void) CommandLineFlags::ccstrAtPut(name, &value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // CommandLineFlags always returns a pointer that needs freeing.
a61af66fc99e Initial load
duke
parents:
diff changeset
562 FREE_C_HEAP_ARRAY(char, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 if (free_this_too != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // CommandLineFlags made its own copy, so I must delete my own temp. buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 FREE_C_HEAP_ARRAY(char, free_this_too);
a61af66fc99e Initial load
duke
parents:
diff changeset
566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
567 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // range of acceptable characters spelled out for portability reasons
a61af66fc99e Initial load
duke
parents:
diff changeset
574 #define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]"
a61af66fc99e Initial load
duke
parents:
diff changeset
575 #define BUFLEN 255
a61af66fc99e Initial load
duke
parents:
diff changeset
576 char name[BUFLEN+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
577 char dummy;
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 if (sscanf(arg, "-%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
580 return set_bool_flag(name, false, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
581 }
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (sscanf(arg, "+%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 return set_bool_flag(name, true, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
584 }
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 char punct;
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "%c", name, &punct) == 2 && punct == '=') {
a61af66fc99e Initial load
duke
parents:
diff changeset
588 const char* value = strchr(arg, '=') + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
589 Flag* flag = Flag::find_flag(name, strlen(name));
a61af66fc99e Initial load
duke
parents:
diff changeset
590 if (flag != NULL && flag->is_ccstr()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
591 if (flag->ccstr_accumulates()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
592 return append_to_string_flag(name, value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
593 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (value[0] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 value = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597 return set_string_flag(name, value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 }
a61af66fc99e Initial load
duke
parents:
diff changeset
599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE ":%c", name, &punct) == 2 && punct == '=') {
a61af66fc99e Initial load
duke
parents:
diff changeset
603 const char* value = strchr(arg, '=') + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // -XX:Foo:=xxx will reset the string flag to the given value.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 if (value[0] == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 value = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
607 }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 return set_string_flag(name, value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 #define SIGNED_FP_NUMBER_RANGE "[-0123456789.]"
a61af66fc99e Initial load
duke
parents:
diff changeset
612 #define SIGNED_NUMBER_RANGE "[-0123456789]"
a61af66fc99e Initial load
duke
parents:
diff changeset
613 #define NUMBER_RANGE "[0123456789]"
a61af66fc99e Initial load
duke
parents:
diff changeset
614 char value[BUFLEN + 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
615 char value2[BUFLEN + 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
616 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_NUMBER_RANGE "." "%" XSTR(BUFLEN) NUMBER_RANGE "%c", name, value, value2, &dummy) == 3) {
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // Looks like a floating-point number -- try again with more lenient format string
a61af66fc99e Initial load
duke
parents:
diff changeset
618 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_FP_NUMBER_RANGE "%c", name, value, &dummy) == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
619 return set_fp_numeric_flag(name, value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 }
a61af66fc99e Initial load
duke
parents:
diff changeset
622
a61af66fc99e Initial load
duke
parents:
diff changeset
623 #define VALUE_RANGE "[-kmgtKMGT0123456789]"
a61af66fc99e Initial load
duke
parents:
diff changeset
624 if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) VALUE_RANGE "%c", name, value, &dummy) == 2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
625 return set_numeric_flag(name, value, origin);
a61af66fc99e Initial load
duke
parents:
diff changeset
626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
629 }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631
a61af66fc99e Initial load
duke
parents:
diff changeset
632 void Arguments::add_string(char*** bldarray, int* count, const char* arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 assert(bldarray != NULL, "illegal argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 if (arg == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
636 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
637 }
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 int index = *count;
a61af66fc99e Initial load
duke
parents:
diff changeset
640
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // expand the array and add arg to the last element
a61af66fc99e Initial load
duke
parents:
diff changeset
642 (*count)++;
a61af66fc99e Initial load
duke
parents:
diff changeset
643 if (*bldarray == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 *bldarray = NEW_C_HEAP_ARRAY(char*, *count);
a61af66fc99e Initial load
duke
parents:
diff changeset
645 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 *bldarray = REALLOC_C_HEAP_ARRAY(char*, *bldarray, *count);
a61af66fc99e Initial load
duke
parents:
diff changeset
647 }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 (*bldarray)[index] = strdup(arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650
a61af66fc99e Initial load
duke
parents:
diff changeset
651 void Arguments::build_jvm_args(const char* arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
652 add_string(&_jvm_args_array, &_num_jvm_args, arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 }
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 void Arguments::build_jvm_flags(const char* arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 add_string(&_jvm_flags_array, &_num_jvm_flags, arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // utility function to return a string that concatenates all
a61af66fc99e Initial load
duke
parents:
diff changeset
660 // strings in a given char** array
a61af66fc99e Initial load
duke
parents:
diff changeset
661 const char* Arguments::build_resource_string(char** args, int count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if (args == NULL || count == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
664 }
a61af66fc99e Initial load
duke
parents:
diff changeset
665 size_t length = strlen(args[0]) + 1; // add 1 for the null terminator
a61af66fc99e Initial load
duke
parents:
diff changeset
666 for (int i = 1; i < count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
667 length += strlen(args[i]) + 1; // add 1 for a space
a61af66fc99e Initial load
duke
parents:
diff changeset
668 }
a61af66fc99e Initial load
duke
parents:
diff changeset
669 char* s = NEW_RESOURCE_ARRAY(char, length);
a61af66fc99e Initial load
duke
parents:
diff changeset
670 strcpy(s, args[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
671 for (int j = 1; j < count; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
672 strcat(s, " ");
a61af66fc99e Initial load
duke
parents:
diff changeset
673 strcat(s, args[j]);
a61af66fc99e Initial load
duke
parents:
diff changeset
674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
675 return (const char*) s;
a61af66fc99e Initial load
duke
parents:
diff changeset
676 }
a61af66fc99e Initial load
duke
parents:
diff changeset
677
a61af66fc99e Initial load
duke
parents:
diff changeset
678 void Arguments::print_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
679 st->print_cr("VM Arguments:");
a61af66fc99e Initial load
duke
parents:
diff changeset
680 if (num_jvm_flags() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
681 st->print("jvm_flags: "); print_jvm_flags_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
683 if (num_jvm_args() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 st->print("jvm_args: "); print_jvm_args_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
685 }
a61af66fc99e Initial load
duke
parents:
diff changeset
686 st->print_cr("java_command: %s", java_command() ? java_command() : "<unknown>");
a61af66fc99e Initial load
duke
parents:
diff changeset
687 st->print_cr("Launcher Type: %s", _sun_java_launcher);
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 void Arguments::print_jvm_flags_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 if (_num_jvm_flags > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
692 for (int i=0; i < _num_jvm_flags; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 st->print("%s ", _jvm_flags_array[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
695 st->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
696 }
a61af66fc99e Initial load
duke
parents:
diff changeset
697 }
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 void Arguments::print_jvm_args_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
700 if (_num_jvm_args > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
701 for (int i=0; i < _num_jvm_args; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
702 st->print("%s ", _jvm_args_array[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
703 }
a61af66fc99e Initial load
duke
parents:
diff changeset
704 st->print_cr("");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 bool Arguments::process_argument(const char* arg, jboolean ignore_unrecognized, FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710 if (parse_argument(arg, origin)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
711 // do nothing
a61af66fc99e Initial load
duke
parents:
diff changeset
712 } else if (made_obsolete_in_1_5_0(arg)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
713 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
714 "Warning: The flag %s has been EOL'd as of 1.5.0 and will"
a61af66fc99e Initial load
duke
parents:
diff changeset
715 " be ignored\n", arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
716 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
717 if (!ignore_unrecognized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
718 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
719 "Unrecognized VM option '%s'\n", arg);
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // allow for commandline "commenting out" options like -XX:#+Verbose
a61af66fc99e Initial load
duke
parents:
diff changeset
721 if (strlen(arg) == 0 || arg[0] != '#') {
a61af66fc99e Initial load
duke
parents:
diff changeset
722 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
723 }
a61af66fc99e Initial load
duke
parents:
diff changeset
724 }
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
727 }
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 bool Arguments::process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
731 FILE* stream = fopen(file_name, "rb");
a61af66fc99e Initial load
duke
parents:
diff changeset
732 if (stream == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
733 if (should_exist) {
a61af66fc99e Initial load
duke
parents:
diff changeset
734 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
735 "Could not open settings file %s\n", file_name);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
737 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
739 }
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 char token[1024];
a61af66fc99e Initial load
duke
parents:
diff changeset
743 int pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
744
a61af66fc99e Initial load
duke
parents:
diff changeset
745 bool in_white_space = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 bool in_comment = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 bool in_quote = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 char quote_c = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 bool result = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 int c = getc(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
752 while(c != EOF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
753 if (in_white_space) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 if (in_comment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
755 if (c == '\n') in_comment = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
756 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
757 if (c == '#') in_comment = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
758 else if (!isspace(c)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
759 in_white_space = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
760 token[pos++] = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
763 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
764 if (c == '\n' || (!in_quote && isspace(c))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // token ends at newline, or at unquoted whitespace
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // this allows a way to include spaces in string-valued options
a61af66fc99e Initial load
duke
parents:
diff changeset
767 token[pos] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
768 logOption(token);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 result &= process_argument(token, ignore_unrecognized, CONFIG_FILE);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 build_jvm_flags(token);
a61af66fc99e Initial load
duke
parents:
diff changeset
771 pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
772 in_white_space = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
773 in_quote = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
774 } else if (!in_quote && (c == '\'' || c == '"')) {
a61af66fc99e Initial load
duke
parents:
diff changeset
775 in_quote = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 quote_c = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 } else if (in_quote && (c == quote_c)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 in_quote = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
779 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
780 token[pos++] = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
781 }
a61af66fc99e Initial load
duke
parents:
diff changeset
782 }
a61af66fc99e Initial load
duke
parents:
diff changeset
783 c = getc(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785 if (pos > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
786 token[pos] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
787 result &= process_argument(token, ignore_unrecognized, CONFIG_FILE);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 build_jvm_flags(token);
a61af66fc99e Initial load
duke
parents:
diff changeset
789 }
a61af66fc99e Initial load
duke
parents:
diff changeset
790 fclose(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
791 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794 //=============================================================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
795 // Parsing of properties (-D)
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 const char* Arguments::get_property(const char* key) {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 return PropertyList_get_value(system_properties(), key);
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 bool Arguments::add_property(const char* prop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 const char* eq = strchr(prop, '=');
a61af66fc99e Initial load
duke
parents:
diff changeset
803 char* key;
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // ns must be static--its address may be stored in a SystemProperty object.
a61af66fc99e Initial load
duke
parents:
diff changeset
805 const static char ns[1] = {0};
a61af66fc99e Initial load
duke
parents:
diff changeset
806 char* value = (char *)ns;
a61af66fc99e Initial load
duke
parents:
diff changeset
807
a61af66fc99e Initial load
duke
parents:
diff changeset
808 size_t key_len = (eq == NULL) ? strlen(prop) : (eq - prop);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 key = AllocateHeap(key_len + 1, "add_property");
a61af66fc99e Initial load
duke
parents:
diff changeset
810 strncpy(key, prop, key_len);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 key[key_len] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
812
a61af66fc99e Initial load
duke
parents:
diff changeset
813 if (eq != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
814 size_t value_len = strlen(prop) - key_len - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
815 value = AllocateHeap(value_len + 1, "add_property");
a61af66fc99e Initial load
duke
parents:
diff changeset
816 strncpy(value, &prop[key_len + 1], value_len + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
817 }
a61af66fc99e Initial load
duke
parents:
diff changeset
818
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (strcmp(key, "java.compiler") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
820 process_java_compiler_argument(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
821 FreeHeap(key);
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (eq != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 FreeHeap(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
824 }
a61af66fc99e Initial load
duke
parents:
diff changeset
825 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
826 }
a61af66fc99e Initial load
duke
parents:
diff changeset
827 else if (strcmp(key, "sun.java.command") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
828
a61af66fc99e Initial load
duke
parents:
diff changeset
829 _java_command = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
830
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // don't add this property to the properties exposed to the java application
a61af66fc99e Initial load
duke
parents:
diff changeset
832 FreeHeap(key);
a61af66fc99e Initial load
duke
parents:
diff changeset
833 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835 else if (strcmp(key, "sun.java.launcher.pid") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836 // launcher.pid property is private and is processed
a61af66fc99e Initial load
duke
parents:
diff changeset
837 // in process_sun_java_launcher_properties();
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // the sun.java.launcher property is passed on to the java application
a61af66fc99e Initial load
duke
parents:
diff changeset
839 FreeHeap(key);
a61af66fc99e Initial load
duke
parents:
diff changeset
840 if (eq != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
841 FreeHeap(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
842 }
a61af66fc99e Initial load
duke
parents:
diff changeset
843 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845 else if (strcmp(key, "java.vendor.url.bug") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
846 // save it in _java_vendor_url_bug, so JVM fatal error handler can access
a61af66fc99e Initial load
duke
parents:
diff changeset
847 // its value without going through the property list or making a Java call.
a61af66fc99e Initial load
duke
parents:
diff changeset
848 _java_vendor_url_bug = value;
a61af66fc99e Initial load
duke
parents:
diff changeset
849 }
a61af66fc99e Initial load
duke
parents:
diff changeset
850
a61af66fc99e Initial load
duke
parents:
diff changeset
851 // Create new property and add at the end of the list
a61af66fc99e Initial load
duke
parents:
diff changeset
852 PropertyList_unique_add(&_system_properties, key, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
853 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 //===========================================================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
857 // Setting int/mixed/comp mode flags
a61af66fc99e Initial load
duke
parents:
diff changeset
858
a61af66fc99e Initial load
duke
parents:
diff changeset
859 void Arguments::set_mode_flags(Mode mode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
860 // Set up default values for all flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
861 // If you add a flag to any of the branches below,
a61af66fc99e Initial load
duke
parents:
diff changeset
862 // add a default value for it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
863 set_java_compiler(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
864 _mode = mode;
a61af66fc99e Initial load
duke
parents:
diff changeset
865
a61af66fc99e Initial load
duke
parents:
diff changeset
866 // Ensure Agent_OnLoad has the correct initial values.
a61af66fc99e Initial load
duke
parents:
diff changeset
867 // This may not be the final mode; mode may change later in onload phase.
a61af66fc99e Initial load
duke
parents:
diff changeset
868 PropertyList_unique_add(&_system_properties, "java.vm.info",
a61af66fc99e Initial load
duke
parents:
diff changeset
869 (char*)Abstract_VM_Version::vm_info_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
870
a61af66fc99e Initial load
duke
parents:
diff changeset
871 UseInterpreter = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 UseCompiler = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 UseLoopCounter = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 // Default values may be platform/compiler dependent -
a61af66fc99e Initial load
duke
parents:
diff changeset
876 // use the saved values
a61af66fc99e Initial load
duke
parents:
diff changeset
877 ClipInlining = Arguments::_ClipInlining;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 AlwaysCompileLoopMethods = Arguments::_AlwaysCompileLoopMethods;
a61af66fc99e Initial load
duke
parents:
diff changeset
879 UseOnStackReplacement = Arguments::_UseOnStackReplacement;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 BackgroundCompilation = Arguments::_BackgroundCompilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
881 Tier2CompileThreshold = Arguments::_Tier2CompileThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
882
a61af66fc99e Initial load
duke
parents:
diff changeset
883 // Change from defaults based on mode
a61af66fc99e Initial load
duke
parents:
diff changeset
884 switch (mode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
885 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
886 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
887 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
888 case _int:
a61af66fc99e Initial load
duke
parents:
diff changeset
889 UseCompiler = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 UseLoopCounter = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 AlwaysCompileLoopMethods = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 UseOnStackReplacement = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
893 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 case _mixed:
a61af66fc99e Initial load
duke
parents:
diff changeset
895 // same as default
a61af66fc99e Initial load
duke
parents:
diff changeset
896 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 case _comp:
a61af66fc99e Initial load
duke
parents:
diff changeset
898 UseInterpreter = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 BackgroundCompilation = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 ClipInlining = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
901 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 }
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // Conflict: required to use shared spaces (-Xshare:on), but
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // incompatible command line options were chosen.
a61af66fc99e Initial load
duke
parents:
diff changeset
908
a61af66fc99e Initial load
duke
parents:
diff changeset
909 static void no_shared_spaces() {
a61af66fc99e Initial load
duke
parents:
diff changeset
910 if (RequireSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
911 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
912 "Class data sharing is inconsistent with other specified options.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
913 vm_exit_during_initialization("Unable to use shared archive.", NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
914 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
915 FLAG_SET_DEFAULT(UseSharedSpaces, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
916 }
a61af66fc99e Initial load
duke
parents:
diff changeset
917 }
a61af66fc99e Initial load
duke
parents:
diff changeset
918
a61af66fc99e Initial load
duke
parents:
diff changeset
919
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC
a61af66fc99e Initial load
duke
parents:
diff changeset
921 // if it's not explictly set or unset. If the user has chosen
a61af66fc99e Initial load
duke
parents:
diff changeset
922 // UseParNewGC and not explicitly set ParallelGCThreads we
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // set it, unless this is a single cpu machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
924 void Arguments::set_parnew_gc_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
925 assert(!UseSerialGC && !UseParallelGC, "control point invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
926
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
927 // 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
928 // complete.
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
929 if (UseParNewGC &&
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
930 FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
931 FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
932 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
933
0
a61af66fc99e Initial load
duke
parents:
diff changeset
934 if (FLAG_IS_DEFAULT(UseParNewGC) && ParallelGCThreads > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
935 FLAG_SET_DEFAULT(UseParNewGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
936 } else if (UseParNewGC && ParallelGCThreads == 0) {
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
937 FLAG_SET_DEFAULT(ParallelGCThreads,
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
938 Abstract_VM_Version::parallel_worker_threads());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
939 if (FLAG_IS_DEFAULT(ParallelGCThreads) && ParallelGCThreads == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
940 FLAG_SET_DEFAULT(UseParNewGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
941 }
a61af66fc99e Initial load
duke
parents:
diff changeset
942 }
a61af66fc99e Initial load
duke
parents:
diff changeset
943 if (!UseParNewGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
944 FLAG_SET_DEFAULT(ParallelGCThreads, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
945 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 no_shared_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
947
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // By default YoungPLABSize and OldPLABSize are set to 4096 and 1024 correspondinly,
a61af66fc99e Initial load
duke
parents:
diff changeset
949 // these settings are default for Parallel Scavenger. For ParNew+Tenured configuration
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // we set them to 1024 and 1024.
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // See CR 6362902.
a61af66fc99e Initial load
duke
parents:
diff changeset
952 if (FLAG_IS_DEFAULT(YoungPLABSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
953 FLAG_SET_DEFAULT(YoungPLABSize, (intx)1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
954 }
a61af66fc99e Initial load
duke
parents:
diff changeset
955 if (FLAG_IS_DEFAULT(OldPLABSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
956 FLAG_SET_DEFAULT(OldPLABSize, (intx)1024);
a61af66fc99e Initial load
duke
parents:
diff changeset
957 }
a61af66fc99e Initial load
duke
parents:
diff changeset
958
a61af66fc99e Initial load
duke
parents:
diff changeset
959 // AlwaysTenure flag should make ParNew to promote all at first collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
960 // See CR 6362902.
a61af66fc99e Initial load
duke
parents:
diff changeset
961 if (AlwaysTenure) {
a61af66fc99e Initial load
duke
parents:
diff changeset
962 FLAG_SET_CMDLINE(intx, MaxTenuringThreshold, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
963 }
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // Adjust some sizes to suit CMS and/or ParNew needs; these work well on
a61af66fc99e Initial load
duke
parents:
diff changeset
968 // sparc/solaris for certain applications, but would gain from
a61af66fc99e Initial load
duke
parents:
diff changeset
969 // further optimization and tuning efforts, and would almost
a61af66fc99e Initial load
duke
parents:
diff changeset
970 // certainly gain from analysis of platform and environment.
a61af66fc99e Initial load
duke
parents:
diff changeset
971 void Arguments::set_cms_and_parnew_gc_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
972 if (UseSerialGC || UseParallelGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
974 }
a61af66fc99e Initial load
duke
parents:
diff changeset
975
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
976 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
977
0
a61af66fc99e Initial load
duke
parents:
diff changeset
978 // If we are using CMS, we prefer to UseParNewGC,
a61af66fc99e Initial load
duke
parents:
diff changeset
979 // unless explicitly forbidden.
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
980 if (!UseParNewGC && FLAG_IS_DEFAULT(UseParNewGC)) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
981 FLAG_SET_ERGO(bool, UseParNewGC, true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
983
a61af66fc99e Initial load
duke
parents:
diff changeset
984 // 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
985 // complete.
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
986 if (FLAG_IS_DEFAULT(UseAdaptiveSizePolicy)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989
a61af66fc99e Initial load
duke
parents:
diff changeset
990 // In either case, adjust ParallelGCThreads and/or UseParNewGC
a61af66fc99e Initial load
duke
parents:
diff changeset
991 // as needed.
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
992 if (UseParNewGC) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
993 set_parnew_gc_flags();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
994 }
a61af66fc99e Initial load
duke
parents:
diff changeset
995
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // Now make adjustments for CMS
a61af66fc99e Initial load
duke
parents:
diff changeset
997 size_t young_gen_per_worker;
a61af66fc99e Initial load
duke
parents:
diff changeset
998 intx new_ratio;
a61af66fc99e Initial load
duke
parents:
diff changeset
999 size_t min_new_default;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 intx tenuring_default;
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 if (CMSUseOldDefaults) { // old defaults: "old" as of 6.0
a61af66fc99e Initial load
duke
parents:
diff changeset
1002 if FLAG_IS_DEFAULT(CMSYoungGenPerWorker) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1003 FLAG_SET_ERGO(intx, CMSYoungGenPerWorker, 4*M);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 young_gen_per_worker = 4*M;
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 new_ratio = (intx)15;
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 min_new_default = 4*M;
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 tenuring_default = (intx)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 } else { // new defaults: "new" as of 6.0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 young_gen_per_worker = CMSYoungGenPerWorker;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 new_ratio = (intx)7;
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 min_new_default = 16*M;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 tenuring_default = (intx)4;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1015
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 // Preferred young gen size for "short" pauses
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 const uintx parallel_gc_threads =
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 (ParallelGCThreads == 0 ? 1 : ParallelGCThreads);
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 const size_t preferred_max_new_size_unaligned =
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 ScaleForWordSize(young_gen_per_worker * parallel_gc_threads);
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 const size_t preferred_max_new_size =
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 align_size_up(preferred_max_new_size_unaligned, os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1023
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 // Unless explicitly requested otherwise, size young gen
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 // for "short" pauses ~ 4M*ParallelGCThreads
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 if (FLAG_IS_DEFAULT(MaxNewSize)) { // MaxNewSize not set at command-line
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 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
1028 FLAG_SET_ERGO(uintx, MaxNewSize, MAX2(NewSize, preferred_max_new_size));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 } else {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1030 FLAG_SET_ERGO(uintx, MaxNewSize, preferred_max_new_size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 }
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1032 if(PrintGCDetails && Verbose) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1033 // Too early to use gclog_or_tty
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1034 tty->print_cr("Ergo set MaxNewSize: " SIZE_FORMAT, MaxNewSize);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1035 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 // Unless explicitly requested otherwise, prefer a large
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 // Old to Young gen size so as to shift the collection load
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 // to the old generation concurrent collector
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 if (FLAG_IS_DEFAULT(NewRatio)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1041 FLAG_SET_ERGO(intx, NewRatio, MAX2(NewRatio, new_ratio));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 size_t min_new = align_size_up(ScaleForWordSize(min_new_default), os::vm_page_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 size_t prev_initial_size = initial_heap_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 if (prev_initial_size != 0 && prev_initial_size < min_new+OldSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 set_initial_heap_size(min_new+OldSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // Currently minimum size and the initial heap sizes are the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 set_min_heap_size(initial_heap_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 warning("Initial heap size increased to " SIZE_FORMAT " M from "
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 SIZE_FORMAT " M; use -XX:NewSize=... for finer control.",
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 initial_heap_size()/M, prev_initial_size/M);
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // MaxHeapSize is aligned down in collectorPolicy
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 size_t max_heap = align_size_down(MaxHeapSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 CardTableRS::ct_max_alignment_constraint());
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1059 if(PrintGCDetails && Verbose) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1060 // Too early to use gclog_or_tty
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1061 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
1062 " initial_heap_size: " SIZE_FORMAT
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1063 " max_heap: " SIZE_FORMAT,
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1064 min_heap_size(), initial_heap_size(), max_heap);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1065 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 if (max_heap > min_new) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 // Unless explicitly requested otherwise, make young gen
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 // at least min_new, and at most preferred_max_new_size.
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 if (FLAG_IS_DEFAULT(NewSize)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1070 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
1071 FLAG_SET_ERGO(uintx, NewSize, MIN2(preferred_max_new_size, NewSize));
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1072 if(PrintGCDetails && Verbose) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1073 // Too early to use gclog_or_tty
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1074 tty->print_cr("Ergo set NewSize: " SIZE_FORMAT, NewSize);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1075 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // Unless explicitly requested otherwise, size old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // so that it's at least 3X of NewSize to begin with;
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // later NewRatio will decide how it grows; see above.
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 if (FLAG_IS_DEFAULT(OldSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 if (max_heap > NewSize) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1082 FLAG_SET_ERGO(uintx, OldSize, MIN2(3*NewSize, max_heap - NewSize));
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1083 if(PrintGCDetails && Verbose) {
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1084 // Too early to use gclog_or_tty
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1085 tty->print_cr("Ergo set OldSize: " SIZE_FORMAT, OldSize);
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1086 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 // Unless explicitly requested otherwise, definitely
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 // promote all objects surviving "tenuring_default" scavenges.
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 if (FLAG_IS_DEFAULT(MaxTenuringThreshold) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 FLAG_IS_DEFAULT(SurvivorRatio)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1095 FLAG_SET_ERGO(intx, MaxTenuringThreshold, tenuring_default);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 // If we decided above (or user explicitly requested)
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 // `promote all' (via MaxTenuringThreshold := 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 // prefer minuscule survivor spaces so as not to waste
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 // space for (non-existent) survivors
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 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
1102 FLAG_SET_ERGO(intx, SurvivorRatio, MAX2((intx)1024, SurvivorRatio));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 // If OldPLABSize is set and CMSParPromoteBlocksToClaim is not,
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 // set CMSParPromoteBlocksToClaim equal to OldPLABSize.
a61af66fc99e Initial load
duke
parents:
diff changeset
1106 // This is done in order to make ParNew+CMS configuration to work
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 // with YoungPLABSize and OldPLABSize options.
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 // See CR 6362902.
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 if (!FLAG_IS_DEFAULT(OldPLABSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 if (FLAG_IS_DEFAULT(CMSParPromoteBlocksToClaim)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1111 // 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
1112 // is. In this situtation let CMSParPromoteBlocksToClaim follow
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1113 // 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
1114 // OldPLABSize. Following OldPLABSize is an ergonomics decision.
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1115 FLAG_SET_ERGO(uintx, CMSParPromoteBlocksToClaim, OldPLABSize);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 // OldPLABSize and CMSParPromoteBlocksToClaim are both set.
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 // CMSParPromoteBlocksToClaim is a collector-specific flag, so
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 // we'll let it to take precedence.
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 "Both OldPLABSize and CMSParPromoteBlocksToClaim options are specified "
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 "for the CMS collector. CMSParPromoteBlocksToClaim will take precedence.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1127
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 bool Arguments::should_auto_select_low_pause_collector() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 if (UseAutoGCSelectPolicy &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 !FLAG_IS_DEFAULT(MaxGCPauseMillis) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 (MaxGCPauseMillis <= AutoGCSelectPauseMillis)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // Cannot use gclog_or_tty yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 tty->print_cr("Automatic selection of the low pause collector"
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 " based on pause goal of %d (ms)", MaxGCPauseMillis);
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 void Arguments::set_ergonomics_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // Parallel GC is not compatible with sharing. If one specifies
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 // that they want sharing explicitly, do not set ergonmics flags.
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 if (DumpSharedSpaces || ForceSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 if (os::is_server_class_machine() && !force_client_mode ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 // If no other collector is requested explicitly,
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // let the VM select the collector based on
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // machine class and automatic selection policy.
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 if (!UseSerialGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 !UseConcMarkSweepGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 !UseParNewGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 !DumpSharedSpaces &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 FLAG_IS_DEFAULT(UseParallelGC)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 if (should_auto_select_low_pause_collector()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 FLAG_SET_ERGO(bool, UseConcMarkSweepGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 FLAG_SET_ERGO(bool, UseParallelGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 no_shared_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1167
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 void Arguments::set_parallel_gc_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 // If parallel old was requested, automatically enable parallel scavenge.
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 if (UseParallelOldGC && !UseParallelGC && FLAG_IS_DEFAULT(UseParallelGC)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 FLAG_SET_DEFAULT(UseParallelGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 // If no heap maximum was requested explicitly, use some reasonable fraction
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 // of the physical memory, up to a maximum of 1GB.
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 if (UseParallelGC) {
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1177 FLAG_SET_ERGO(uintx, ParallelGCThreads,
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1178 Abstract_VM_Version::parallel_worker_threads());
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1179
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 if (FLAG_IS_DEFAULT(MaxHeapSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 const uint64_t reasonable_fraction =
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 os::physical_memory() / DefaultMaxRAMFraction;
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 const uint64_t maximum_size = (uint64_t) DefaultMaxRAM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 size_t reasonable_max =
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 (size_t) os::allocatable_physical_memory(reasonable_fraction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 if (reasonable_max > maximum_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 reasonable_max = maximum_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 // Cannot use gclog_or_tty yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 tty->print_cr(" Max heap size for server class platform "
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 SIZE_FORMAT, reasonable_max);
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // If the initial_heap_size has not been set with -Xms,
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 // then set it as fraction of size of physical memory
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 // respecting the maximum and minimum sizes of the heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 if (initial_heap_size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 const uint64_t reasonable_initial_fraction =
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 os::physical_memory() / DefaultInitialRAMFraction;
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 const size_t reasonable_initial =
a61af66fc99e Initial load
duke
parents:
diff changeset
1201 (size_t) os::allocatable_physical_memory(reasonable_initial_fraction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 const size_t minimum_size = NewSize + OldSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 set_initial_heap_size(MAX2(MIN2(reasonable_initial, reasonable_max),
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 minimum_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 // Currently the minimum size and the initial heap sizes are the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
1206 set_min_heap_size(initial_heap_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 if (PrintGCDetails && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 // Cannot use gclog_or_tty yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 tty->print_cr(" Initial heap size for server class platform "
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 SIZE_FORMAT, initial_heap_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // An minimum size was specified on the command line. Be sure
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // that the maximum size is consistent.
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 if (initial_heap_size() > reasonable_max) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 reasonable_max = initial_heap_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 FLAG_SET_ERGO(uintx, MaxHeapSize, (uintx) reasonable_max);
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1221
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 // If InitialSurvivorRatio or MinSurvivorRatio were not specified, but the
a61af66fc99e Initial load
duke
parents:
diff changeset
1223 // SurvivorRatio has been set, reset their default values to SurvivorRatio +
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // 2. By doing this we make SurvivorRatio also work for Parallel Scavenger.
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // See CR 6362902 for details.
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 if (!FLAG_IS_DEFAULT(SurvivorRatio)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 if (FLAG_IS_DEFAULT(InitialSurvivorRatio)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 FLAG_SET_DEFAULT(InitialSurvivorRatio, SurvivorRatio + 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 if (FLAG_IS_DEFAULT(MinSurvivorRatio)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 FLAG_SET_DEFAULT(MinSurvivorRatio, SurvivorRatio + 2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1234
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 if (UseParallelOldGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 // 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
1237 // 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
1238 // interpretation and are not ergonomically set.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 if (FLAG_IS_DEFAULT(MarkSweepDeadRatio)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1240 FLAG_SET_DEFAULT(MarkSweepDeadRatio, 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1242 if (FLAG_IS_DEFAULT(PermMarkSweepDeadRatio)) {
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
1243 FLAG_SET_DEFAULT(PermMarkSweepDeadRatio, 5);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // This must be called after ergonomics because we want bytecode rewriting
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // if the server compiler is used, or if UseSharedSpaces is disabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 void Arguments::set_bytecode_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // Better not attempt to store into a read-only space.
a61af66fc99e Initial load
duke
parents:
diff changeset
1253 if (UseSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1254 FLAG_SET_DEFAULT(RewriteBytecodes, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1255 FLAG_SET_DEFAULT(RewriteFrequentPairs, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1257
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 if (!RewriteBytecodes) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1259 FLAG_SET_DEFAULT(RewriteFrequentPairs, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1262
a61af66fc99e Initial load
duke
parents:
diff changeset
1263 // Aggressive optimization flags -XX:+AggressiveOpts
a61af66fc99e Initial load
duke
parents:
diff changeset
1264 void Arguments::set_aggressive_opts_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 if (AggressiveOpts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 NOT_WINDOWS(
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 // No measured benefit on Windows
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 if (FLAG_IS_DEFAULT(CacheTimeMillis)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1269 FLAG_SET_DEFAULT(CacheTimeMillis, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 )
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1274
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 //===========================================================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 // Parsing of java.compiler property
a61af66fc99e Initial load
duke
parents:
diff changeset
1277
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 void Arguments::process_java_compiler_argument(char* arg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1279 // For backwards compatibility, Djava.compiler=NONE or ""
a61af66fc99e Initial load
duke
parents:
diff changeset
1280 // causes us to switch to -Xint mode UNLESS -Xdebug
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 // is also specified.
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 if (strlen(arg) == 0 || strcasecmp(arg, "NONE") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 set_java_compiler(true); // "-Djava.compiler[=...]" most recently seen.
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 void Arguments::process_java_launcher_argument(const char* launcher, void* extra_info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 _sun_java_launcher = strdup(launcher);
a61af66fc99e Initial load
duke
parents:
diff changeset
1289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1290
a61af66fc99e Initial load
duke
parents:
diff changeset
1291 bool Arguments::created_by_java_launcher() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 assert(_sun_java_launcher != NULL, "property must have value");
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 return strcmp(DEFAULT_JAVA_LAUNCHER, _sun_java_launcher) != 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1295
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 //===========================================================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 // Parsing of main arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1298
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 bool Arguments::verify_percentage(uintx value, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 if (value <= 100) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 "%s of " UINTX_FORMAT " is invalid; must be between 0 and 100\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 name, value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 static void set_serial_gc_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 FLAG_SET_DEFAULT(UseSerialGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 FLAG_SET_DEFAULT(UseParNewGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 FLAG_SET_DEFAULT(UseConcMarkSweepGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 FLAG_SET_DEFAULT(UseParallelGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 FLAG_SET_DEFAULT(UseParallelOldGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1316
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 static bool verify_serial_gc_flags() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 return (UseSerialGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 !(UseParNewGC || UseConcMarkSweepGC || UseParallelGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 UseParallelOldGC));
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1323 // Check consistency of GC selection
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1324 bool Arguments::check_gc_consistency() {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1325 bool status = true;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1326 // 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
1327 // 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
1328 // 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
1329 // 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
1330 // 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
1331 // 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
1332 // select conflicting combinations.
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1333 uint i = 0;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1334 if (UseSerialGC) i++;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1335 if (UseConcMarkSweepGC || UseParNewGC) i++;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1336 if (UseParallelGC || UseParallelOldGC) i++;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1337 if (i > 1) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1338 jio_fprintf(defaultStream::error_stream(),
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1339 "Conflicting collector combinations in option list; "
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1340 "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
1341 "allowed\n");
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1342 status = false;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1343 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1344
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1345 return status;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1346 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1347
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1348 // Check the consistency of vm_init_args
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 bool Arguments::check_vm_args_consistency() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 // Method for adding checks for flag consistency.
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // The intent is to warn the user of all possible conflicts,
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // before returning an error.
a61af66fc99e Initial load
duke
parents:
diff changeset
1353 // Note: Needs platform-dependent factoring.
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 bool status = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1355
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 #if ( (defined(COMPILER2) && defined(SPARC)))
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // NOTE: The call to VM_Version_init depends on the fact that VM_Version_init
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 // on sparc doesn't require generation of a stub as is the case on, e.g.,
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 // x86. Normally, VM_Version_init must be called from init_globals in
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 // init.cpp, which is called by the initial java thread *after* arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // have been parsed. VM_Version_init gets called twice on sparc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 extern void VM_Version_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 VM_Version_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 if (!VM_Version::has_v9()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 "V8 Machine detected, Server requires V9\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 #endif /* COMPILER2 && SPARC */
a61af66fc99e Initial load
duke
parents:
diff changeset
1370
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 // Allow both -XX:-UseStackBanging and -XX:-UseBoundThreads in non-product
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // builds so the cost of stack banging can be measured.
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 #if (defined(PRODUCT) && defined(SOLARIS))
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 if (!UseBoundThreads && !UseStackBanging) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 "-UseStackBanging conflicts with -UseBoundThreads\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1377
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1381
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 if (TLABRefillWasteFraction == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 "TLABRefillWasteFraction should be a denominator, "
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 "not " SIZE_FORMAT "\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 TLABRefillWasteFraction);
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1389
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1390 status = status && verify_percentage(MaxLiveObjectEvacuationRatio,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 "MaxLiveObjectEvacuationRatio");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1392 status = status && verify_percentage(AdaptiveSizePolicyWeight,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 "AdaptiveSizePolicyWeight");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1394 status = status && verify_percentage(AdaptivePermSizeWeight, "AdaptivePermSizeWeight");
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1395 status = status && verify_percentage(ThresholdTolerance, "ThresholdTolerance");
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1396 status = status && verify_percentage(MinHeapFreeRatio, "MinHeapFreeRatio");
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1397 status = status && verify_percentage(MaxHeapFreeRatio, "MaxHeapFreeRatio");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1398
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 if (MinHeapFreeRatio > MaxHeapFreeRatio) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 "MinHeapFreeRatio (" UINTX_FORMAT ") must be less than or "
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 "equal to MaxHeapFreeRatio (" UINTX_FORMAT ")\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 MinHeapFreeRatio, MaxHeapFreeRatio);
a61af66fc99e Initial load
duke
parents:
diff changeset
1404 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // Keeping the heap 100% free is hard ;-) so limit it to 99%.
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 MinHeapFreeRatio = MIN2(MinHeapFreeRatio, (uintx) 99);
a61af66fc99e Initial load
duke
parents:
diff changeset
1408
a61af66fc99e Initial load
duke
parents:
diff changeset
1409 if (FullGCALot && FLAG_IS_DEFAULT(MarkSweepAlwaysCompactCount)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 MarkSweepAlwaysCompactCount = 1; // Move objects every gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1412
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1413 status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1414 status = status && verify_percentage(GCTimeLimit, "GCTimeLimit");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1415 if (GCTimeLimit == 100) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 // Turn off gc-overhead-limit-exceeded checks
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 FLAG_SET_DEFAULT(UseGCOverheadLimit, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1419
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1420 status = status && verify_percentage(GCHeapFreeLimit, "GCHeapFreeLimit");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1421
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // Check user specified sharing option conflict with Parallel GC
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 bool cannot_share = (UseConcMarkSweepGC || UseParallelGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 UseParallelOldGC || UseParNewGC ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 SOLARIS_ONLY(UseISM) NOT_SOLARIS(UseLargePages));
a61af66fc99e Initial load
duke
parents:
diff changeset
1426
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 if (cannot_share) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 // Either force sharing on by forcing the other options off, or
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 // force sharing off.
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 if (DumpSharedSpaces || ForceSharedSpaces) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 set_serial_gc_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 FLAG_SET_DEFAULT(SOLARIS_ONLY(UseISM) NOT_SOLARIS(UseLargePages), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 no_shared_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
1435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1437
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1438 status = status && check_gc_consistency();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1439
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 if (_has_alloc_profile) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 if (UseParallelGC || UseParallelOldGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 "error: invalid argument combination.\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 "Allocation profiling (-Xaprof) cannot be used together with "
a61af66fc99e Initial load
duke
parents:
diff changeset
1445 "Parallel GC (-XX:+UseParallelGC or -XX:+UseParallelOldGC).\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 if (UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 "error: invalid argument combination.\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 "Allocation profiling (-Xaprof) cannot be used together with "
a61af66fc99e Initial load
duke
parents:
diff changeset
1452 "the CMS collector (-XX:+UseConcMarkSweepGC).\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1455 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1456
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 if (CMSIncrementalMode) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 if (!UseConcMarkSweepGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1460 "error: invalid argument combination.\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 "The CMS collector (-XX:+UseConcMarkSweepGC) must be "
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 "selected in order\nto use CMSIncrementalMode.\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 } else if (!UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 "error: CMSIncrementalMode requires thread-local "
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 "allocation buffers\n(-XX:+UseTLAB).\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 } else {
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1470 status = status && verify_percentage(CMSIncrementalDutyCycle,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 "CMSIncrementalDutyCycle");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1472 status = status && verify_percentage(CMSIncrementalDutyCycleMin,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 "CMSIncrementalDutyCycleMin");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1474 status = status && verify_percentage(CMSIncrementalSafetyFactor,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 "CMSIncrementalSafetyFactor");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1476 status = status && verify_percentage(CMSIncrementalOffset,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 "CMSIncrementalOffset");
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
1478 status = status && verify_percentage(CMSExpAvgFactor,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 "CMSExpAvgFactor");
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 // If it was not set on the command line, set
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 // CMSInitiatingOccupancyFraction to 1 so icms can initiate cycles early.
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 if (CMSInitiatingOccupancyFraction < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 FLAG_SET_DEFAULT(CMSInitiatingOccupancyFraction, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1487
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 if (UseNUMA && !UseTLAB) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 "error: NUMA allocator (-XX:+UseNUMA) requires thread-local "
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 "allocation\nbuffers (-XX:+UseTLAB).\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1494
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 // CMS space iteration, which FLSVerifyAllHeapreferences entails,
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 // insists that we hold the requisite locks so that the iteration is
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 // MT-safe. For the verification at start-up and shut-down, we don't
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 // yet have a good way of acquiring and releasing these locks,
a61af66fc99e Initial load
duke
parents:
diff changeset
1499 // which are not visible at the CollectedHeap level. We want to
a61af66fc99e Initial load
duke
parents:
diff changeset
1500 // be able to acquire these locks and then do the iteration rather
a61af66fc99e Initial load
duke
parents:
diff changeset
1501 // than just disable the lock verification. This will be fixed under
a61af66fc99e Initial load
duke
parents:
diff changeset
1502 // bug 4788986.
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (UseConcMarkSweepGC && FLSVerifyAllHeapReferences) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1504 if (VerifyGCStartAt == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1505 warning("Heap verification at start-up disabled "
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 "(due to current incompatibility with FLSVerifyAllHeapReferences)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1507 VerifyGCStartAt = 1; // Disable verification at start-up
a61af66fc99e Initial load
duke
parents:
diff changeset
1508 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1509 if (VerifyBeforeExit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1510 warning("Heap verification at shutdown disabled "
a61af66fc99e Initial load
duke
parents:
diff changeset
1511 "(due to current incompatibility with FLSVerifyAllHeapReferences)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1512 VerifyBeforeExit = false; // Disable verification at shutdown
a61af66fc99e Initial load
duke
parents:
diff changeset
1513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1515
a61af66fc99e Initial load
duke
parents:
diff changeset
1516 // Note: only executed in non-PRODUCT mode
a61af66fc99e Initial load
duke
parents:
diff changeset
1517 if (!UseAsyncConcMarkSweepGC &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1518 (ExplicitGCInvokesConcurrent ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1519 ExplicitGCInvokesConcurrentAndUnloadsClasses)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1520 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1521 "error: +ExplictGCInvokesConcurrent[AndUnloadsClasses] conflicts"
a61af66fc99e Initial load
duke
parents:
diff changeset
1522 " with -UseAsyncConcMarkSweepGC");
a61af66fc99e Initial load
duke
parents:
diff changeset
1523 status = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1525
a61af66fc99e Initial load
duke
parents:
diff changeset
1526 return status;
a61af66fc99e Initial load
duke
parents:
diff changeset
1527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1528
a61af66fc99e Initial load
duke
parents:
diff changeset
1529 bool Arguments::is_bad_option(const JavaVMOption* option, jboolean ignore,
a61af66fc99e Initial load
duke
parents:
diff changeset
1530 const char* option_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1531 if (ignore) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1532
a61af66fc99e Initial load
duke
parents:
diff changeset
1533 const char* spacer = " ";
a61af66fc99e Initial load
duke
parents:
diff changeset
1534 if (option_type == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1535 option_type = ++spacer; // Set both to the empty string.
a61af66fc99e Initial load
duke
parents:
diff changeset
1536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1537
a61af66fc99e Initial load
duke
parents:
diff changeset
1538 if (os::obsolete_option(option)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1540 "Obsolete %s%soption: %s\n", option_type, spacer,
a61af66fc99e Initial load
duke
parents:
diff changeset
1541 option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1542 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 "Unrecognized %s%soption: %s\n", option_type, spacer,
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1550
a61af66fc99e Initial load
duke
parents:
diff changeset
1551 static const char* user_assertion_options[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 "-da", "-ea", "-disableassertions", "-enableassertions", 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1554
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 static const char* system_assertion_options[] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 "-dsa", "-esa", "-disablesystemassertions", "-enablesystemassertions", 0
a61af66fc99e Initial load
duke
parents:
diff changeset
1557 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1558
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 // Return true if any of the strings in null-terminated array 'names' matches.
a61af66fc99e Initial load
duke
parents:
diff changeset
1560 // If tail_allowed is true, then the tail must begin with a colon; otherwise,
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 // the option must match exactly.
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 static bool match_option(const JavaVMOption* option, const char** names, const char** tail,
a61af66fc99e Initial load
duke
parents:
diff changeset
1563 bool tail_allowed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 for (/* empty */; *names != NULL; ++names) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 if (match_option(option, *names, tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1566 if (**tail == '\0' || tail_allowed && **tail == ':') {
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1571 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1573
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 Arguments::ArgsRange Arguments::parse_memory_size(const char* s,
a61af66fc99e Initial load
duke
parents:
diff changeset
1575 jlong* long_arg,
a61af66fc99e Initial load
duke
parents:
diff changeset
1576 jlong min_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1577 if (!atomll(s, long_arg)) return arg_unreadable;
a61af66fc99e Initial load
duke
parents:
diff changeset
1578 return check_memory_size(*long_arg, min_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1580
a61af66fc99e Initial load
duke
parents:
diff changeset
1581 // Parse JavaVMInitArgs structure
a61af66fc99e Initial load
duke
parents:
diff changeset
1582
a61af66fc99e Initial load
duke
parents:
diff changeset
1583 jint Arguments::parse_vm_init_args(const JavaVMInitArgs* args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1584 // For components of the system classpath.
a61af66fc99e Initial load
duke
parents:
diff changeset
1585 SysClassPath scp(Arguments::get_sysclasspath());
a61af66fc99e Initial load
duke
parents:
diff changeset
1586 bool scp_assembly_required = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1587
a61af66fc99e Initial load
duke
parents:
diff changeset
1588 // Save default settings for some mode flags
a61af66fc99e Initial load
duke
parents:
diff changeset
1589 Arguments::_AlwaysCompileLoopMethods = AlwaysCompileLoopMethods;
a61af66fc99e Initial load
duke
parents:
diff changeset
1590 Arguments::_UseOnStackReplacement = UseOnStackReplacement;
a61af66fc99e Initial load
duke
parents:
diff changeset
1591 Arguments::_ClipInlining = ClipInlining;
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 Arguments::_BackgroundCompilation = BackgroundCompilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
1593 Arguments::_Tier2CompileThreshold = Tier2CompileThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
1594
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 // Parse JAVA_TOOL_OPTIONS environment variable (if present)
a61af66fc99e Initial load
duke
parents:
diff changeset
1596 jint result = parse_java_tool_options_environment_variable(&scp, &scp_assembly_required);
a61af66fc99e Initial load
duke
parents:
diff changeset
1597 if (result != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1598 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1600
a61af66fc99e Initial load
duke
parents:
diff changeset
1601 // Parse JavaVMInitArgs structure passed in
a61af66fc99e Initial load
duke
parents:
diff changeset
1602 result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, COMMAND_LINE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1603 if (result != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1604 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1606
a61af66fc99e Initial load
duke
parents:
diff changeset
1607 // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM)
a61af66fc99e Initial load
duke
parents:
diff changeset
1608 result = parse_java_options_environment_variable(&scp, &scp_assembly_required);
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 if (result != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1610 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1611 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1612
a61af66fc99e Initial load
duke
parents:
diff changeset
1613 // Do final processing now that all arguments have been parsed
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 result = finalize_vm_init_args(&scp, scp_assembly_required);
a61af66fc99e Initial load
duke
parents:
diff changeset
1615 if (result != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1616 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1618
a61af66fc99e Initial load
duke
parents:
diff changeset
1619 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
1620 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1621
a61af66fc99e Initial load
duke
parents:
diff changeset
1622
a61af66fc99e Initial load
duke
parents:
diff changeset
1623 jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
a61af66fc99e Initial load
duke
parents:
diff changeset
1624 SysClassPath* scp_p,
a61af66fc99e Initial load
duke
parents:
diff changeset
1625 bool* scp_assembly_required_p,
a61af66fc99e Initial load
duke
parents:
diff changeset
1626 FlagValueOrigin origin) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1627 // Remaining part of option string
a61af66fc99e Initial load
duke
parents:
diff changeset
1628 const char* tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
1629
a61af66fc99e Initial load
duke
parents:
diff changeset
1630 // iterate over arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
1631 for (int index = 0; index < args->nOptions; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1632 bool is_absolute_path = false; // for -agentpath vs -agentlib
a61af66fc99e Initial load
duke
parents:
diff changeset
1633
a61af66fc99e Initial load
duke
parents:
diff changeset
1634 const JavaVMOption* option = args->options + index;
a61af66fc99e Initial load
duke
parents:
diff changeset
1635
a61af66fc99e Initial load
duke
parents:
diff changeset
1636 if (!match_option(option, "-Djava.class.path", &tail) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1637 !match_option(option, "-Dsun.java.command", &tail) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 !match_option(option, "-Dsun.java.launcher", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1639
a61af66fc99e Initial load
duke
parents:
diff changeset
1640 // add all jvm options to the jvm_args string. This string
a61af66fc99e Initial load
duke
parents:
diff changeset
1641 // is used later to set the java.vm.args PerfData string constant.
a61af66fc99e Initial load
duke
parents:
diff changeset
1642 // the -Djava.class.path and the -Dsun.java.command options are
a61af66fc99e Initial load
duke
parents:
diff changeset
1643 // omitted from jvm_args string as each have their own PerfData
a61af66fc99e Initial load
duke
parents:
diff changeset
1644 // string constant object.
a61af66fc99e Initial load
duke
parents:
diff changeset
1645 build_jvm_args(option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1647
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 // -verbose:[class/gc/jni]
a61af66fc99e Initial load
duke
parents:
diff changeset
1649 if (match_option(option, "-verbose", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 if (!strcmp(tail, ":class") || !strcmp(tail, "")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 FLAG_SET_CMDLINE(bool, TraceClassLoading, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 FLAG_SET_CMDLINE(bool, TraceClassUnloading, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1653 } else if (!strcmp(tail, ":gc")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 FLAG_SET_CMDLINE(bool, PrintGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 FLAG_SET_CMDLINE(bool, TraceClassUnloading, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 } else if (!strcmp(tail, ":jni")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 FLAG_SET_CMDLINE(bool, PrintJNIResolving, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 // -da / -ea / -disableassertions / -enableassertions
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 // These accept an optional class/package name separated by a colon, e.g.,
a61af66fc99e Initial load
duke
parents:
diff changeset
1661 // -da:java.lang.Thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
1662 } else if (match_option(option, user_assertion_options, &tail, true)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1663 bool enable = option->optionString[1] == 'e'; // char after '-' is 'e'
a61af66fc99e Initial load
duke
parents:
diff changeset
1664 if (*tail == '\0') {
a61af66fc99e Initial load
duke
parents:
diff changeset
1665 JavaAssertions::setUserClassDefault(enable);
a61af66fc99e Initial load
duke
parents:
diff changeset
1666 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 assert(*tail == ':', "bogus match by match_option()");
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 JavaAssertions::addOption(tail + 1, enable);
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 // -dsa / -esa / -disablesystemassertions / -enablesystemassertions
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 } else if (match_option(option, system_assertion_options, &tail, false)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 bool enable = option->optionString[1] == 'e'; // char after '-' is 'e'
a61af66fc99e Initial load
duke
parents:
diff changeset
1673 JavaAssertions::setSystemClassDefault(enable);
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 // -bootclasspath:
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 } else if (match_option(option, "-Xbootclasspath:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 scp_p->reset_path(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 *scp_assembly_required_p = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 // -bootclasspath/a:
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 } else if (match_option(option, "-Xbootclasspath/a:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 scp_p->add_suffix(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 *scp_assembly_required_p = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 // -bootclasspath/p:
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 } else if (match_option(option, "-Xbootclasspath/p:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 scp_p->add_prefix(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
1685 *scp_assembly_required_p = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1686 // -Xrun
a61af66fc99e Initial load
duke
parents:
diff changeset
1687 } else if (match_option(option, "-Xrun", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1688 if(tail != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1689 const char* pos = strchr(tail, ':');
a61af66fc99e Initial load
duke
parents:
diff changeset
1690 size_t len = (pos == NULL) ? strlen(tail) : pos - tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
1691 char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 name[len] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1693
a61af66fc99e Initial load
duke
parents:
diff changeset
1694 char *options = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1695 if(pos != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 size_t len2 = strlen(pos+1) + 1; // options start after ':'. Final zero must be copied.
a61af66fc99e Initial load
duke
parents:
diff changeset
1697 options = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len2), pos+1, len2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1699 #ifdef JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1700 if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1701 warning("profiling and debugging agents are not supported with Kernel VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
1702 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
1703 #endif // JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1704 add_init_library(name, options);
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 // -agentlib and -agentpath
a61af66fc99e Initial load
duke
parents:
diff changeset
1707 } else if (match_option(option, "-agentlib:", &tail) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
1708 (is_absolute_path = match_option(option, "-agentpath:", &tail))) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1709 if(tail != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1710 const char* pos = strchr(tail, '=');
a61af66fc99e Initial load
duke
parents:
diff changeset
1711 size_t len = (pos == NULL) ? strlen(tail) : pos - tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
1712 char* name = strncpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len);
a61af66fc99e Initial load
duke
parents:
diff changeset
1713 name[len] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
1714
a61af66fc99e Initial load
duke
parents:
diff changeset
1715 char *options = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1716 if(pos != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1717 options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(pos + 1) + 1), pos + 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1718 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 #ifdef JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 if ((strcmp(name, "hprof") == 0) || (strcmp(name, "jdwp") == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 warning("profiling and debugging agents are not supported with Kernel VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 #endif // JVMTI_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 add_init_agent(name, options, is_absolute_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
1725
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 // -javaagent
a61af66fc99e Initial load
duke
parents:
diff changeset
1728 } else if (match_option(option, "-javaagent:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1729 if(tail != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1730 char *options = strcpy(NEW_C_HEAP_ARRAY(char, strlen(tail) + 1), tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
1731 add_init_agent("instrument", options, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1732 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1733 // -Xnoclassgc
a61af66fc99e Initial load
duke
parents:
diff changeset
1734 } else if (match_option(option, "-Xnoclassgc", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1735 FLAG_SET_CMDLINE(bool, ClassUnloading, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1736 // -Xincgc: i-CMS
a61af66fc99e Initial load
duke
parents:
diff changeset
1737 } else if (match_option(option, "-Xincgc", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1738 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1739 FLAG_SET_CMDLINE(bool, CMSIncrementalMode, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1740 // -Xnoincgc: no i-CMS
a61af66fc99e Initial load
duke
parents:
diff changeset
1741 } else if (match_option(option, "-Xnoincgc", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1742 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1743 FLAG_SET_CMDLINE(bool, CMSIncrementalMode, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1744 // -Xconcgc
a61af66fc99e Initial load
duke
parents:
diff changeset
1745 } else if (match_option(option, "-Xconcgc", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1746 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1747 // -Xnoconcgc
a61af66fc99e Initial load
duke
parents:
diff changeset
1748 } else if (match_option(option, "-Xnoconcgc", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1749 FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1750 // -Xbatch
a61af66fc99e Initial load
duke
parents:
diff changeset
1751 } else if (match_option(option, "-Xbatch", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1752 FLAG_SET_CMDLINE(bool, BackgroundCompilation, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1753 // -Xmn for compatibility with other JVM vendors
a61af66fc99e Initial load
duke
parents:
diff changeset
1754 } else if (match_option(option, "-Xmn", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1755 jlong long_initial_eden_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1756 ArgsRange errcode = parse_memory_size(tail, &long_initial_eden_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1757 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1758 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1759 "Invalid initial eden size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1760 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1761 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1762 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1763 FLAG_SET_CMDLINE(uintx, MaxNewSize, (size_t) long_initial_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1764 FLAG_SET_CMDLINE(uintx, NewSize, (size_t) long_initial_eden_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1765 // -Xms
a61af66fc99e Initial load
duke
parents:
diff changeset
1766 } else if (match_option(option, "-Xms", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1767 jlong long_initial_heap_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1768 ArgsRange errcode = parse_memory_size(tail, &long_initial_heap_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1769 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1770 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1771 "Invalid initial heap size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1772 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1773 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1775 set_initial_heap_size((size_t) long_initial_heap_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1776 // Currently the minimum size and the initial heap sizes are the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
1777 set_min_heap_size(initial_heap_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
1778 // -Xmx
a61af66fc99e Initial load
duke
parents:
diff changeset
1779 } else if (match_option(option, "-Xmx", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1780 jlong long_max_heap_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1781 ArgsRange errcode = parse_memory_size(tail, &long_max_heap_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1782 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1783 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1784 "Invalid maximum heap size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1785 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1786 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1787 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1788 FLAG_SET_CMDLINE(uintx, MaxHeapSize, (size_t) long_max_heap_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
1789 // Xmaxf
a61af66fc99e Initial load
duke
parents:
diff changeset
1790 } else if (match_option(option, "-Xmaxf", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1791 int maxf = (int)(atof(tail) * 100);
a61af66fc99e Initial load
duke
parents:
diff changeset
1792 if (maxf < 0 || maxf > 100) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1793 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1794 "Bad max heap free percentage size: %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1795 option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1796 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1797 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1798 FLAG_SET_CMDLINE(uintx, MaxHeapFreeRatio, maxf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1800 // Xminf
a61af66fc99e Initial load
duke
parents:
diff changeset
1801 } else if (match_option(option, "-Xminf", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1802 int minf = (int)(atof(tail) * 100);
a61af66fc99e Initial load
duke
parents:
diff changeset
1803 if (minf < 0 || minf > 100) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1804 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1805 "Bad min heap free percentage size: %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1806 option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1807 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1808 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1809 FLAG_SET_CMDLINE(uintx, MinHeapFreeRatio, minf);
a61af66fc99e Initial load
duke
parents:
diff changeset
1810 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1811 // -Xss
a61af66fc99e Initial load
duke
parents:
diff changeset
1812 } else if (match_option(option, "-Xss", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1813 jlong long_ThreadStackSize = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1814 ArgsRange errcode = parse_memory_size(tail, &long_ThreadStackSize, 1000);
a61af66fc99e Initial load
duke
parents:
diff changeset
1815 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1816 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1817 "Invalid thread stack size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1818 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1819 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1821 // Internally track ThreadStackSize in units of 1024 bytes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1822 FLAG_SET_CMDLINE(intx, ThreadStackSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1823 round_to((int)long_ThreadStackSize, K) / K);
a61af66fc99e Initial load
duke
parents:
diff changeset
1824 // -Xoss
a61af66fc99e Initial load
duke
parents:
diff changeset
1825 } else if (match_option(option, "-Xoss", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1826 // HotSpot does not have separate native and Java stacks, ignore silently for compatibility
a61af66fc99e Initial load
duke
parents:
diff changeset
1827 // -Xmaxjitcodesize
a61af66fc99e Initial load
duke
parents:
diff changeset
1828 } else if (match_option(option, "-Xmaxjitcodesize", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1829 jlong long_ReservedCodeCacheSize = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1830 ArgsRange errcode = parse_memory_size(tail, &long_ReservedCodeCacheSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
1831 InitialCodeCacheSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1832 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1833 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1834 "Invalid maximum code cache size: %s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1835 option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
1836 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
1837 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1838 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1839 FLAG_SET_CMDLINE(uintx, ReservedCodeCacheSize, (uintx)long_ReservedCodeCacheSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
1840 // -green
a61af66fc99e Initial load
duke
parents:
diff changeset
1841 } else if (match_option(option, "-green", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1842 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1843 "Green threads support not available\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
1844 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1845 // -native
a61af66fc99e Initial load
duke
parents:
diff changeset
1846 } else if (match_option(option, "-native", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1847 // HotSpot always uses native threads, ignore silently for compatibility
a61af66fc99e Initial load
duke
parents:
diff changeset
1848 // -Xsqnopause
a61af66fc99e Initial load
duke
parents:
diff changeset
1849 } else if (match_option(option, "-Xsqnopause", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1850 // EVM option, ignore silently for compatibility
a61af66fc99e Initial load
duke
parents:
diff changeset
1851 // -Xrs
a61af66fc99e Initial load
duke
parents:
diff changeset
1852 } else if (match_option(option, "-Xrs", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1853 // Classic/EVM option, new functionality
a61af66fc99e Initial load
duke
parents:
diff changeset
1854 FLAG_SET_CMDLINE(bool, ReduceSignalUsage, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1855 } else if (match_option(option, "-Xusealtsigs", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1856 // change default internal VM signals used - lower case for back compat
a61af66fc99e Initial load
duke
parents:
diff changeset
1857 FLAG_SET_CMDLINE(bool, UseAltSigs, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1858 // -Xoptimize
a61af66fc99e Initial load
duke
parents:
diff changeset
1859 } else if (match_option(option, "-Xoptimize", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1860 // EVM option, ignore silently for compatibility
a61af66fc99e Initial load
duke
parents:
diff changeset
1861 // -Xprof
a61af66fc99e Initial load
duke
parents:
diff changeset
1862 } else if (match_option(option, "-Xprof", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1863 #ifndef FPROF_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1864 _has_profile = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1865 #else // FPROF_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1866 // do we have to exit?
a61af66fc99e Initial load
duke
parents:
diff changeset
1867 warning("Kernel VM does not support flat profiling.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1868 #endif // FPROF_KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
1869 // -Xaprof
a61af66fc99e Initial load
duke
parents:
diff changeset
1870 } else if (match_option(option, "-Xaprof", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1871 _has_alloc_profile = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1872 // -Xconcurrentio
a61af66fc99e Initial load
duke
parents:
diff changeset
1873 } else if (match_option(option, "-Xconcurrentio", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1874 FLAG_SET_CMDLINE(bool, UseLWPSynchronization, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1875 FLAG_SET_CMDLINE(bool, BackgroundCompilation, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1876 FLAG_SET_CMDLINE(intx, DeferThrSuspendLoopCount, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1877 FLAG_SET_CMDLINE(bool, UseTLAB, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1878 FLAG_SET_CMDLINE(uintx, NewSizeThreadIncrease, 16 * K); // 20Kb per thread added to new generation
a61af66fc99e Initial load
duke
parents:
diff changeset
1879
a61af66fc99e Initial load
duke
parents:
diff changeset
1880 // -Xinternalversion
a61af66fc99e Initial load
duke
parents:
diff changeset
1881 } else if (match_option(option, "-Xinternalversion", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1882 jio_fprintf(defaultStream::output_stream(), "%s\n",
a61af66fc99e Initial load
duke
parents:
diff changeset
1883 VM_Version::internal_vm_info_string());
a61af66fc99e Initial load
duke
parents:
diff changeset
1884 vm_exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1885 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1886 // -Xprintflags
a61af66fc99e Initial load
duke
parents:
diff changeset
1887 } else if (match_option(option, "-Xprintflags", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1888 CommandLineFlags::printFlags();
a61af66fc99e Initial load
duke
parents:
diff changeset
1889 vm_exit(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1890 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1891 // -D
a61af66fc99e Initial load
duke
parents:
diff changeset
1892 } else if (match_option(option, "-D", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1893 if (!add_property(tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1894 return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
1895 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1896 // Out of the box management support
a61af66fc99e Initial load
duke
parents:
diff changeset
1897 if (match_option(option, "-Dcom.sun.management", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1898 FLAG_SET_CMDLINE(bool, ManagementServer, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1899 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1900 // -Xint
a61af66fc99e Initial load
duke
parents:
diff changeset
1901 } else if (match_option(option, "-Xint", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1902 set_mode_flags(_int);
a61af66fc99e Initial load
duke
parents:
diff changeset
1903 // -Xmixed
a61af66fc99e Initial load
duke
parents:
diff changeset
1904 } else if (match_option(option, "-Xmixed", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1905 set_mode_flags(_mixed);
a61af66fc99e Initial load
duke
parents:
diff changeset
1906 // -Xcomp
a61af66fc99e Initial load
duke
parents:
diff changeset
1907 } else if (match_option(option, "-Xcomp", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1908 // for testing the compiler; turn off all flags that inhibit compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
1909 set_mode_flags(_comp);
a61af66fc99e Initial load
duke
parents:
diff changeset
1910
a61af66fc99e Initial load
duke
parents:
diff changeset
1911 // -Xshare:dump
a61af66fc99e Initial load
duke
parents:
diff changeset
1912 } else if (match_option(option, "-Xshare:dump", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1913 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
1914 FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1915 set_mode_flags(_int); // Prevent compilation, which creates objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1916 #elif defined(COMPILER2)
a61af66fc99e Initial load
duke
parents:
diff changeset
1917 vm_exit_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
1918 "Dumping a shared archive is not supported on the Server JVM.", NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1919 #elif defined(KERNEL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1920 vm_exit_during_initialization(
a61af66fc99e Initial load
duke
parents:
diff changeset
1921 "Dumping a shared archive is not supported on the Kernel JVM.", NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1922 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
1923 FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1924 set_mode_flags(_int); // Prevent compilation, which creates objects
a61af66fc99e Initial load
duke
parents:
diff changeset
1925 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1926 // -Xshare:on
a61af66fc99e Initial load
duke
parents:
diff changeset
1927 } else if (match_option(option, "-Xshare:on", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1928 FLAG_SET_CMDLINE(bool, UseSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1929 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1930 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
1931 FLAG_SET_CMDLINE(bool, ForceSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1932 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
1933 // -Xshare:auto
a61af66fc99e Initial load
duke
parents:
diff changeset
1934 } else if (match_option(option, "-Xshare:auto", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1935 FLAG_SET_CMDLINE(bool, UseSharedSpaces, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1936 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1937 // -Xshare:off
a61af66fc99e Initial load
duke
parents:
diff changeset
1938 } else if (match_option(option, "-Xshare:off", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1939 FLAG_SET_CMDLINE(bool, UseSharedSpaces, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1940 FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1941
a61af66fc99e Initial load
duke
parents:
diff changeset
1942 // -Xverify
a61af66fc99e Initial load
duke
parents:
diff changeset
1943 } else if (match_option(option, "-Xverify", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1944 if (strcmp(tail, ":all") == 0 || strcmp(tail, "") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1945 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1946 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1947 } else if (strcmp(tail, ":remote") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1948 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1949 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1950 } else if (strcmp(tail, ":none") == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1951 FLAG_SET_CMDLINE(bool, BytecodeVerificationLocal, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1952 FLAG_SET_CMDLINE(bool, BytecodeVerificationRemote, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1953 } else if (is_bad_option(option, args->ignoreUnrecognized, "verification")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1954 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1956 // -Xdebug
a61af66fc99e Initial load
duke
parents:
diff changeset
1957 } else if (match_option(option, "-Xdebug", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1958 // note this flag has been used, then ignore
a61af66fc99e Initial load
duke
parents:
diff changeset
1959 set_xdebug_mode(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1960 // -Xnoagent
a61af66fc99e Initial load
duke
parents:
diff changeset
1961 } else if (match_option(option, "-Xnoagent", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1962 // For compatibility with classic. HotSpot refuses to load the old style agent.dll.
a61af66fc99e Initial load
duke
parents:
diff changeset
1963 } else if (match_option(option, "-Xboundthreads", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1964 // Bind user level threads to kernel threads (Solaris only)
a61af66fc99e Initial load
duke
parents:
diff changeset
1965 FLAG_SET_CMDLINE(bool, UseBoundThreads, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1966 } else if (match_option(option, "-Xloggc:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1967 // Redirect GC output to the file. -Xloggc:<filename>
a61af66fc99e Initial load
duke
parents:
diff changeset
1968 // ostream_init_log(), when called will use this filename
a61af66fc99e Initial load
duke
parents:
diff changeset
1969 // to initialize a fileStream.
a61af66fc99e Initial load
duke
parents:
diff changeset
1970 _gc_log_filename = strdup(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
1971 FLAG_SET_CMDLINE(bool, PrintGC, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1972 FLAG_SET_CMDLINE(bool, PrintGCTimeStamps, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1973 FLAG_SET_CMDLINE(bool, TraceClassUnloading, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1974
a61af66fc99e Initial load
duke
parents:
diff changeset
1975 // JNI hooks
a61af66fc99e Initial load
duke
parents:
diff changeset
1976 } else if (match_option(option, "-Xcheck", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1977 if (!strcmp(tail, ":jni")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1978 CheckJNICalls = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1979 } else if (is_bad_option(option, args->ignoreUnrecognized,
a61af66fc99e Initial load
duke
parents:
diff changeset
1980 "check")) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1981 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1982 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1983 } else if (match_option(option, "vfprintf", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1984 _vfprintf_hook = CAST_TO_FN_PTR(vfprintf_hook_t, option->extraInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1985 } else if (match_option(option, "exit", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1986 _exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1987 } else if (match_option(option, "abort", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1988 _abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
1989 // -XX:+AggressiveHeap
a61af66fc99e Initial load
duke
parents:
diff changeset
1990 } else if (match_option(option, "-XX:+AggressiveHeap", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1991
a61af66fc99e Initial load
duke
parents:
diff changeset
1992 // This option inspects the machine and attempts to set various
a61af66fc99e Initial load
duke
parents:
diff changeset
1993 // parameters to be optimal for long-running, memory allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
1994 // intensive jobs. It is intended for machines with large
a61af66fc99e Initial load
duke
parents:
diff changeset
1995 // amounts of cpu and memory.
a61af66fc99e Initial load
duke
parents:
diff changeset
1996
a61af66fc99e Initial load
duke
parents:
diff changeset
1997 // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit
a61af66fc99e Initial load
duke
parents:
diff changeset
1998 // VM, but we may not be able to represent the total physical memory
a61af66fc99e Initial load
duke
parents:
diff changeset
1999 // available (like having 8gb of memory on a box but using a 32bit VM).
a61af66fc99e Initial load
duke
parents:
diff changeset
2000 // Thus, we need to make sure we're using a julong for intermediate
a61af66fc99e Initial load
duke
parents:
diff changeset
2001 // calculations.
a61af66fc99e Initial load
duke
parents:
diff changeset
2002 julong initHeapSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2003 julong total_memory = os::physical_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
2004
a61af66fc99e Initial load
duke
parents:
diff changeset
2005 if (total_memory < (julong)256*M) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2006 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2007 "You need at least 256mb of memory to use -XX:+AggressiveHeap\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2008 vm_exit(1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2009 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2010
a61af66fc99e Initial load
duke
parents:
diff changeset
2011 // The heap size is half of available memory, or (at most)
a61af66fc99e Initial load
duke
parents:
diff changeset
2012 // all of possible memory less 160mb (leaving room for the OS
a61af66fc99e Initial load
duke
parents:
diff changeset
2013 // when using ISM). This is the maximum; because adaptive sizing
a61af66fc99e Initial load
duke
parents:
diff changeset
2014 // is turned on below, the actual space used may be smaller.
a61af66fc99e Initial load
duke
parents:
diff changeset
2015
a61af66fc99e Initial load
duke
parents:
diff changeset
2016 initHeapSize = MIN2(total_memory / (julong)2,
a61af66fc99e Initial load
duke
parents:
diff changeset
2017 total_memory - (julong)160*M);
a61af66fc99e Initial load
duke
parents:
diff changeset
2018
a61af66fc99e Initial load
duke
parents:
diff changeset
2019 // Make sure that if we have a lot of memory we cap the 32 bit
a61af66fc99e Initial load
duke
parents:
diff changeset
2020 // process space. The 64bit VM version of this function is a nop.
a61af66fc99e Initial load
duke
parents:
diff changeset
2021 initHeapSize = os::allocatable_physical_memory(initHeapSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2022
a61af66fc99e Initial load
duke
parents:
diff changeset
2023 // The perm gen is separate but contiguous with the
a61af66fc99e Initial load
duke
parents:
diff changeset
2024 // object heap (and is reserved with it) so subtract it
a61af66fc99e Initial load
duke
parents:
diff changeset
2025 // from the heap size.
a61af66fc99e Initial load
duke
parents:
diff changeset
2026 if (initHeapSize > MaxPermSize) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2027 initHeapSize = initHeapSize - MaxPermSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
2028 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2029 warning("AggressiveHeap and MaxPermSize values may conflict");
a61af66fc99e Initial load
duke
parents:
diff changeset
2030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2031
a61af66fc99e Initial load
duke
parents:
diff changeset
2032 if (FLAG_IS_DEFAULT(MaxHeapSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2033 FLAG_SET_CMDLINE(uintx, MaxHeapSize, initHeapSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2034 set_initial_heap_size(MaxHeapSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2035 // Currently the minimum size and the initial heap sizes are the same.
a61af66fc99e Initial load
duke
parents:
diff changeset
2036 set_min_heap_size(initial_heap_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
2037 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2038 if (FLAG_IS_DEFAULT(NewSize)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2039 // Make the young generation 3/8ths of the total heap.
a61af66fc99e Initial load
duke
parents:
diff changeset
2040 FLAG_SET_CMDLINE(uintx, NewSize,
a61af66fc99e Initial load
duke
parents:
diff changeset
2041 ((julong)MaxHeapSize / (julong)8) * (julong)3);
a61af66fc99e Initial load
duke
parents:
diff changeset
2042 FLAG_SET_CMDLINE(uintx, MaxNewSize, NewSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2043 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2044
a61af66fc99e Initial load
duke
parents:
diff changeset
2045 FLAG_SET_DEFAULT(UseLargePages, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2046
a61af66fc99e Initial load
duke
parents:
diff changeset
2047 // Increase some data structure sizes for efficiency
a61af66fc99e Initial load
duke
parents:
diff changeset
2048 FLAG_SET_CMDLINE(uintx, BaseFootPrintEstimate, MaxHeapSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
2049 FLAG_SET_CMDLINE(bool, ResizeTLAB, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2050 FLAG_SET_CMDLINE(uintx, TLABSize, 256*K);
a61af66fc99e Initial load
duke
parents:
diff changeset
2051
a61af66fc99e Initial load
duke
parents:
diff changeset
2052 // See the OldPLABSize comment below, but replace 'after promotion'
a61af66fc99e Initial load
duke
parents:
diff changeset
2053 // with 'after copying'. YoungPLABSize is the size of the survivor
a61af66fc99e Initial load
duke
parents:
diff changeset
2054 // space per-gc-thread buffers. The default is 4kw.
a61af66fc99e Initial load
duke
parents:
diff changeset
2055 FLAG_SET_CMDLINE(uintx, YoungPLABSize, 256*K); // Note: this is in words
a61af66fc99e Initial load
duke
parents:
diff changeset
2056
a61af66fc99e Initial load
duke
parents:
diff changeset
2057 // OldPLABSize is the size of the buffers in the old gen that
a61af66fc99e Initial load
duke
parents:
diff changeset
2058 // UseParallelGC uses to promote live data that doesn't fit in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2059 // survivor spaces. At any given time, there's one for each gc thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
2060 // The default size is 1kw. These buffers are rarely used, since the
a61af66fc99e Initial load
duke
parents:
diff changeset
2061 // survivor spaces are usually big enough. For specjbb, however, there
a61af66fc99e Initial load
duke
parents:
diff changeset
2062 // are occasions when there's lots of live data in the young gen
a61af66fc99e Initial load
duke
parents:
diff changeset
2063 // and we end up promoting some of it. We don't have a definite
a61af66fc99e Initial load
duke
parents:
diff changeset
2064 // explanation for why bumping OldPLABSize helps, but the theory
a61af66fc99e Initial load
duke
parents:
diff changeset
2065 // is that a bigger PLAB results in retaining something like the
a61af66fc99e Initial load
duke
parents:
diff changeset
2066 // original allocation order after promotion, which improves mutator
a61af66fc99e Initial load
duke
parents:
diff changeset
2067 // locality. A minor effect may be that larger PLABs reduce the
a61af66fc99e Initial load
duke
parents:
diff changeset
2068 // number of PLAB allocation events during gc. The value of 8kw
a61af66fc99e Initial load
duke
parents:
diff changeset
2069 // was arrived at by experimenting with specjbb.
a61af66fc99e Initial load
duke
parents:
diff changeset
2070 FLAG_SET_CMDLINE(uintx, OldPLABSize, 8*K); // Note: this is in words
a61af66fc99e Initial load
duke
parents:
diff changeset
2071
a61af66fc99e Initial load
duke
parents:
diff changeset
2072 // CompilationPolicyChoice=0 causes the server compiler to adopt
a61af66fc99e Initial load
duke
parents:
diff changeset
2073 // a more conservative which-method-do-I-compile policy when one
a61af66fc99e Initial load
duke
parents:
diff changeset
2074 // of the counters maintained by the interpreter trips. The
a61af66fc99e Initial load
duke
parents:
diff changeset
2075 // result is reduced startup time and improved specjbb and
a61af66fc99e Initial load
duke
parents:
diff changeset
2076 // alacrity performance. Zero is the default, but we set it
a61af66fc99e Initial load
duke
parents:
diff changeset
2077 // explicitly here in case the default changes.
a61af66fc99e Initial load
duke
parents:
diff changeset
2078 // See runtime/compilationPolicy.*.
a61af66fc99e Initial load
duke
parents:
diff changeset
2079 FLAG_SET_CMDLINE(intx, CompilationPolicyChoice, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
2080
a61af66fc99e Initial load
duke
parents:
diff changeset
2081 // Enable parallel GC and adaptive generation sizing
a61af66fc99e Initial load
duke
parents:
diff changeset
2082 FLAG_SET_CMDLINE(bool, UseParallelGC, true);
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2083 FLAG_SET_DEFAULT(ParallelGCThreads,
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2084 Abstract_VM_Version::parallel_worker_threads());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2085
a61af66fc99e Initial load
duke
parents:
diff changeset
2086 // Encourage steady state memory management
a61af66fc99e Initial load
duke
parents:
diff changeset
2087 FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100);
a61af66fc99e Initial load
duke
parents:
diff changeset
2088
a61af66fc99e Initial load
duke
parents:
diff changeset
2089 // This appears to improve mutator locality
a61af66fc99e Initial load
duke
parents:
diff changeset
2090 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2091
a61af66fc99e Initial load
duke
parents:
diff changeset
2092 // Get around early Solaris scheduling bug
a61af66fc99e Initial load
duke
parents:
diff changeset
2093 // (affinity vs other jobs on system)
a61af66fc99e Initial load
duke
parents:
diff changeset
2094 // but disallow DR and offlining (5008695).
a61af66fc99e Initial load
duke
parents:
diff changeset
2095 FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2096
a61af66fc99e Initial load
duke
parents:
diff changeset
2097 } else if (match_option(option, "-XX:+NeverTenure", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2098 // The last option must always win.
a61af66fc99e Initial load
duke
parents:
diff changeset
2099 FLAG_SET_CMDLINE(bool, AlwaysTenure, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2100 FLAG_SET_CMDLINE(bool, NeverTenure, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2101 } else if (match_option(option, "-XX:+AlwaysTenure", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2102 // The last option must always win.
a61af66fc99e Initial load
duke
parents:
diff changeset
2103 FLAG_SET_CMDLINE(bool, NeverTenure, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2104 FLAG_SET_CMDLINE(bool, AlwaysTenure, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2105 } else if (match_option(option, "-XX:+CMSPermGenSweepingEnabled", &tail) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
2106 match_option(option, "-XX:-CMSPermGenSweepingEnabled", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2107 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2108 "Please use CMSClassUnloadingEnabled in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2109 "CMSPermGenSweepingEnabled in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2110 } else if (match_option(option, "-XX:+UseGCTimeLimit", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2111 FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2112 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2113 "Please use -XX:+UseGCOverheadLimit in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2114 "-XX:+UseGCTimeLimit in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2115 } else if (match_option(option, "-XX:-UseGCTimeLimit", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2116 FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2117 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2118 "Please use -XX:-UseGCOverheadLimit in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2119 "-XX:-UseGCTimeLimit in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2120 // The TLE options are for compatibility with 1.3 and will be
a61af66fc99e Initial load
duke
parents:
diff changeset
2121 // removed without notice in a future release. These options
a61af66fc99e Initial load
duke
parents:
diff changeset
2122 // are not to be documented.
a61af66fc99e Initial load
duke
parents:
diff changeset
2123 } else if (match_option(option, "-XX:MaxTLERatio=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2124 // No longer used.
a61af66fc99e Initial load
duke
parents:
diff changeset
2125 } else if (match_option(option, "-XX:+ResizeTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2126 FLAG_SET_CMDLINE(bool, ResizeTLAB, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2127 } else if (match_option(option, "-XX:-ResizeTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2128 FLAG_SET_CMDLINE(bool, ResizeTLAB, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2129 } else if (match_option(option, "-XX:+PrintTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2130 FLAG_SET_CMDLINE(bool, PrintTLAB, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2131 } else if (match_option(option, "-XX:-PrintTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2132 FLAG_SET_CMDLINE(bool, PrintTLAB, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2133 } else if (match_option(option, "-XX:TLEFragmentationRatio=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2134 // No longer used.
a61af66fc99e Initial load
duke
parents:
diff changeset
2135 } else if (match_option(option, "-XX:TLESize=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2136 jlong long_tlab_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2137 ArgsRange errcode = parse_memory_size(tail, &long_tlab_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2138 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2139 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2140 "Invalid TLAB size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
2141 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
2142 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2144 FLAG_SET_CMDLINE(uintx, TLABSize, long_tlab_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2145 } else if (match_option(option, "-XX:TLEThreadRatio=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2146 // No longer used.
a61af66fc99e Initial load
duke
parents:
diff changeset
2147 } else if (match_option(option, "-XX:+UseTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2148 FLAG_SET_CMDLINE(bool, UseTLAB, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2149 } else if (match_option(option, "-XX:-UseTLE", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2150 FLAG_SET_CMDLINE(bool, UseTLAB, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2151 SOLARIS_ONLY(
a61af66fc99e Initial load
duke
parents:
diff changeset
2152 } else if (match_option(option, "-XX:+UsePermISM", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2153 warning("-XX:+UsePermISM is obsolete.");
a61af66fc99e Initial load
duke
parents:
diff changeset
2154 FLAG_SET_CMDLINE(bool, UseISM, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2155 } else if (match_option(option, "-XX:-UsePermISM", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2156 FLAG_SET_CMDLINE(bool, UseISM, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2157 )
a61af66fc99e Initial load
duke
parents:
diff changeset
2158 } else if (match_option(option, "-XX:+DisplayVMOutputToStderr", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2159 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2160 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2161 } else if (match_option(option, "-XX:+DisplayVMOutputToStdout", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2162 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2163 FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2164 } else if (match_option(option, "-XX:+ExtendedDTraceProbes", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2165 #ifdef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
2166 FLAG_SET_CMDLINE(bool, ExtendedDTraceProbes, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2167 FLAG_SET_CMDLINE(bool, DTraceMethodProbes, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2168 FLAG_SET_CMDLINE(bool, DTraceAllocProbes, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2169 FLAG_SET_CMDLINE(bool, DTraceMonitorProbes, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2170 #else // ndef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
2171 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2172 "ExtendedDTraceProbes flag is only applicable on Solaris\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2173 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2174 #endif // ndef SOLARIS
a61af66fc99e Initial load
duke
parents:
diff changeset
2175 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
2176 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
2177 if (match_option(option, "-XX:+FullGCALot", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2178 FLAG_SET_CMDLINE(bool, FullGCALot, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2179 // disable scavenge before parallel mark-compact
a61af66fc99e Initial load
duke
parents:
diff changeset
2180 FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2181 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
2182 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2183 if (match_option(option, "-XX:ParCMSPromoteBlocksToClaim=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2184 julong cms_blocks_to_claim = (julong)atol(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
2185 FLAG_SET_CMDLINE(uintx, CMSParPromoteBlocksToClaim, cms_blocks_to_claim);
a61af66fc99e Initial load
duke
parents:
diff changeset
2186 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2187 "Please use -XX:CMSParPromoteBlocksToClaim in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2188 "-XX:ParCMSPromoteBlocksToClaim in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2189 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
2190 if (match_option(option, "-XX:ParallelGCOldGenAllocBufferSize=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2191 jlong old_plab_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2192 ArgsRange errcode = parse_memory_size(tail, &old_plab_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2193 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2194 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2195 "Invalid old PLAB size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
2196 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
2197 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2199 FLAG_SET_CMDLINE(uintx, OldPLABSize, (julong)old_plab_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2200 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2201 "Please use -XX:OldPLABSize in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2202 "-XX:ParallelGCOldGenAllocBufferSize in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2203 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
2204 if (match_option(option, "-XX:ParallelGCToSpaceAllocBufferSize=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2205 jlong young_plab_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2206 ArgsRange errcode = parse_memory_size(tail, &young_plab_size, 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2207 if (errcode != arg_in_range) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2208 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2209 "Invalid young PLAB size: %s\n", option->optionString);
a61af66fc99e Initial load
duke
parents:
diff changeset
2210 describe_range_error(errcode);
a61af66fc99e Initial load
duke
parents:
diff changeset
2211 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2213 FLAG_SET_CMDLINE(uintx, YoungPLABSize, (julong)young_plab_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
2214 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2215 "Please use -XX:YoungPLABSize in place of "
a61af66fc99e Initial load
duke
parents:
diff changeset
2216 "-XX:ParallelGCToSpaceAllocBufferSize in the future\n");
a61af66fc99e Initial load
duke
parents:
diff changeset
2217 } else
a61af66fc99e Initial load
duke
parents:
diff changeset
2218 if (match_option(option, "-XX:", &tail)) { // -XX:xxxx
a61af66fc99e Initial load
duke
parents:
diff changeset
2219 // Skip -XX:Flags= since that case has already been handled
a61af66fc99e Initial load
duke
parents:
diff changeset
2220 if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2221 if (!process_argument(tail, args->ignoreUnrecognized, origin)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2222 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2225 // Unknown option
a61af66fc99e Initial load
duke
parents:
diff changeset
2226 } else if (is_bad_option(option, args->ignoreUnrecognized)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2227 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2230
a61af66fc99e Initial load
duke
parents:
diff changeset
2231 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2233
a61af66fc99e Initial load
duke
parents:
diff changeset
2234 jint Arguments::finalize_vm_init_args(SysClassPath* scp_p, bool scp_assembly_required) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2235 // This must be done after all -D arguments have been processed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2236 scp_p->expand_endorsed();
a61af66fc99e Initial load
duke
parents:
diff changeset
2237
a61af66fc99e Initial load
duke
parents:
diff changeset
2238 if (scp_assembly_required || scp_p->get_endorsed() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2239 // Assemble the bootclasspath elements into the final path.
a61af66fc99e Initial load
duke
parents:
diff changeset
2240 Arguments::set_sysclasspath(scp_p->combined_path());
a61af66fc99e Initial load
duke
parents:
diff changeset
2241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2242
a61af66fc99e Initial load
duke
parents:
diff changeset
2243 // This must be done after all arguments have been processed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2244 // java_compiler() true means set to "NONE" or empty.
a61af66fc99e Initial load
duke
parents:
diff changeset
2245 if (java_compiler() && !xdebug_mode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2246 // For backwards compatibility, we switch to interpreted mode if
a61af66fc99e Initial load
duke
parents:
diff changeset
2247 // -Djava.compiler="NONE" or "" is specified AND "-Xdebug" was
a61af66fc99e Initial load
duke
parents:
diff changeset
2248 // not specified.
a61af66fc99e Initial load
duke
parents:
diff changeset
2249 set_mode_flags(_int);
a61af66fc99e Initial load
duke
parents:
diff changeset
2250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2251 if (CompileThreshold == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2252 set_mode_flags(_int);
a61af66fc99e Initial load
duke
parents:
diff changeset
2253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2254
a61af66fc99e Initial load
duke
parents:
diff changeset
2255 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
2256 // If we are using tiered compilation in the tiered vm then c1 will
a61af66fc99e Initial load
duke
parents:
diff changeset
2257 // do the profiling and we don't want to waste that time in the
a61af66fc99e Initial load
duke
parents:
diff changeset
2258 // interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
2259 if (TieredCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2260 ProfileInterpreter = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2261 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2262 // Since we are running vanilla server we must adjust the compile threshold
a61af66fc99e Initial load
duke
parents:
diff changeset
2263 // unless the user has already adjusted it because the default threshold assumes
a61af66fc99e Initial load
duke
parents:
diff changeset
2264 // we will run tiered.
a61af66fc99e Initial load
duke
parents:
diff changeset
2265
a61af66fc99e Initial load
duke
parents:
diff changeset
2266 if (FLAG_IS_DEFAULT(CompileThreshold)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2267 CompileThreshold = Tier2CompileThreshold;
a61af66fc99e Initial load
duke
parents:
diff changeset
2268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2270 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
2271
a61af66fc99e Initial load
duke
parents:
diff changeset
2272 #ifndef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
2273 // Don't degrade server performance for footprint
a61af66fc99e Initial load
duke
parents:
diff changeset
2274 if (FLAG_IS_DEFAULT(UseLargePages) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2275 MaxHeapSize < LargePageHeapSizeThreshold) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2276 // No need for large granularity pages w/small heaps.
a61af66fc99e Initial load
duke
parents:
diff changeset
2277 // Note that large pages are enabled/disabled for both the
a61af66fc99e Initial load
duke
parents:
diff changeset
2278 // Java heap and the code cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
2279 FLAG_SET_DEFAULT(UseLargePages, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2280 SOLARIS_ONLY(FLAG_SET_DEFAULT(UseMPSS, false));
a61af66fc99e Initial load
duke
parents:
diff changeset
2281 SOLARIS_ONLY(FLAG_SET_DEFAULT(UseISM, false));
a61af66fc99e Initial load
duke
parents:
diff changeset
2282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2283 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
2284 if (!FLAG_IS_DEFAULT(OptoLoopAlignment) && FLAG_IS_DEFAULT(MaxLoopPad)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2285 FLAG_SET_DEFAULT(MaxLoopPad, OptoLoopAlignment-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
2286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2287 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
2288
a61af66fc99e Initial load
duke
parents:
diff changeset
2289 if (!check_vm_args_consistency()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2290 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2292
a61af66fc99e Initial load
duke
parents:
diff changeset
2293 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2295
a61af66fc99e Initial load
duke
parents:
diff changeset
2296 jint Arguments::parse_java_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2297 return parse_options_environment_variable("_JAVA_OPTIONS", scp_p,
a61af66fc99e Initial load
duke
parents:
diff changeset
2298 scp_assembly_required_p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2300
a61af66fc99e Initial load
duke
parents:
diff changeset
2301 jint Arguments::parse_java_tool_options_environment_variable(SysClassPath* scp_p, bool* scp_assembly_required_p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2302 return parse_options_environment_variable("JAVA_TOOL_OPTIONS", scp_p,
a61af66fc99e Initial load
duke
parents:
diff changeset
2303 scp_assembly_required_p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2305
a61af66fc99e Initial load
duke
parents:
diff changeset
2306 jint Arguments::parse_options_environment_variable(const char* name, SysClassPath* scp_p, bool* scp_assembly_required_p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2307 const int N_MAX_OPTIONS = 64;
a61af66fc99e Initial load
duke
parents:
diff changeset
2308 const int OPTION_BUFFER_SIZE = 1024;
a61af66fc99e Initial load
duke
parents:
diff changeset
2309 char buffer[OPTION_BUFFER_SIZE];
a61af66fc99e Initial load
duke
parents:
diff changeset
2310
a61af66fc99e Initial load
duke
parents:
diff changeset
2311 // The variable will be ignored if it exceeds the length of the buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2312 // Don't check this variable if user has special privileges
a61af66fc99e Initial load
duke
parents:
diff changeset
2313 // (e.g. unix su command).
a61af66fc99e Initial load
duke
parents:
diff changeset
2314 if (os::getenv(name, buffer, sizeof(buffer)) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
2315 !os::have_special_privileges()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2316 JavaVMOption options[N_MAX_OPTIONS]; // Construct option array
a61af66fc99e Initial load
duke
parents:
diff changeset
2317 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2318 "Picked up %s: %s\n", name, buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
2319 char* rd = buffer; // pointer to the input string (rd)
a61af66fc99e Initial load
duke
parents:
diff changeset
2320 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2321 for (i = 0; i < N_MAX_OPTIONS;) { // repeat for all options in the input string
a61af66fc99e Initial load
duke
parents:
diff changeset
2322 while (isspace(*rd)) rd++; // skip whitespace
a61af66fc99e Initial load
duke
parents:
diff changeset
2323 if (*rd == 0) break; // we re done when the input string is read completely
a61af66fc99e Initial load
duke
parents:
diff changeset
2324
a61af66fc99e Initial load
duke
parents:
diff changeset
2325 // The output, option string, overwrites the input string.
a61af66fc99e Initial load
duke
parents:
diff changeset
2326 // Because of quoting, the pointer to the option string (wrt) may lag the pointer to
a61af66fc99e Initial load
duke
parents:
diff changeset
2327 // input string (rd).
a61af66fc99e Initial load
duke
parents:
diff changeset
2328 char* wrt = rd;
a61af66fc99e Initial load
duke
parents:
diff changeset
2329
a61af66fc99e Initial load
duke
parents:
diff changeset
2330 options[i++].optionString = wrt; // Fill in option
a61af66fc99e Initial load
duke
parents:
diff changeset
2331 while (*rd != 0 && !isspace(*rd)) { // unquoted strings terminate with a space or NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
2332 if (*rd == '\'' || *rd == '"') { // handle a quoted string
a61af66fc99e Initial load
duke
parents:
diff changeset
2333 int quote = *rd; // matching quote to look for
a61af66fc99e Initial load
duke
parents:
diff changeset
2334 rd++; // don't copy open quote
a61af66fc99e Initial load
duke
parents:
diff changeset
2335 while (*rd != quote) { // include everything (even spaces) up until quote
a61af66fc99e Initial load
duke
parents:
diff changeset
2336 if (*rd == 0) { // string termination means unmatched string
a61af66fc99e Initial load
duke
parents:
diff changeset
2337 jio_fprintf(defaultStream::error_stream(),
a61af66fc99e Initial load
duke
parents:
diff changeset
2338 "Unmatched quote in %s\n", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
2339 return JNI_ERR;
a61af66fc99e Initial load
duke
parents:
diff changeset
2340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2341 *wrt++ = *rd++; // copy to option string
a61af66fc99e Initial load
duke
parents:
diff changeset
2342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2343 rd++; // don't copy close quote
a61af66fc99e Initial load
duke
parents:
diff changeset
2344 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2345 *wrt++ = *rd++; // copy to option string
a61af66fc99e Initial load
duke
parents:
diff changeset
2346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2348 // Need to check if we're done before writing a NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
2349 // because the write could be to the byte that rd is pointing to.
a61af66fc99e Initial load
duke
parents:
diff changeset
2350 if (*rd++ == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2351 *wrt = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2352 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2353 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2354 *wrt = 0; // Zero terminate option
a61af66fc99e Initial load
duke
parents:
diff changeset
2355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2356 // Construct JavaVMInitArgs structure and parse as if it was part of the command line
a61af66fc99e Initial load
duke
parents:
diff changeset
2357 JavaVMInitArgs vm_args;
a61af66fc99e Initial load
duke
parents:
diff changeset
2358 vm_args.version = JNI_VERSION_1_2;
a61af66fc99e Initial load
duke
parents:
diff changeset
2359 vm_args.options = options;
a61af66fc99e Initial load
duke
parents:
diff changeset
2360 vm_args.nOptions = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2361 vm_args.ignoreUnrecognized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2362
a61af66fc99e Initial load
duke
parents:
diff changeset
2363 if (PrintVMOptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2364 const char* tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
2365 for (int i = 0; i < vm_args.nOptions; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2366 const JavaVMOption *option = vm_args.options + i;
a61af66fc99e Initial load
duke
parents:
diff changeset
2367 if (match_option(option, "-XX:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2368 logOption(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
2369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2372
a61af66fc99e Initial load
duke
parents:
diff changeset
2373 return(parse_each_vm_init_arg(&vm_args, scp_p, scp_assembly_required_p, ENVIRON_VAR));
a61af66fc99e Initial load
duke
parents:
diff changeset
2374 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2375 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2376 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2377
a61af66fc99e Initial load
duke
parents:
diff changeset
2378 // Parse entry point called from JNI_CreateJavaVM
a61af66fc99e Initial load
duke
parents:
diff changeset
2379
a61af66fc99e Initial load
duke
parents:
diff changeset
2380 jint Arguments::parse(const JavaVMInitArgs* args) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2381
a61af66fc99e Initial load
duke
parents:
diff changeset
2382 // Sharing support
a61af66fc99e Initial load
duke
parents:
diff changeset
2383 // Construct the path to the archive
a61af66fc99e Initial load
duke
parents:
diff changeset
2384 char jvm_path[JVM_MAXPATHLEN];
a61af66fc99e Initial load
duke
parents:
diff changeset
2385 os::jvm_path(jvm_path, sizeof(jvm_path));
a61af66fc99e Initial load
duke
parents:
diff changeset
2386 #ifdef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
2387 if (strstr(jvm_path, "client") != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2388 force_client_mode = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2389 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2390 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
2391 char *end = strrchr(jvm_path, *os::file_separator());
a61af66fc99e Initial load
duke
parents:
diff changeset
2392 if (end != NULL) *end = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
2393 char *shared_archive_path = NEW_C_HEAP_ARRAY(char, strlen(jvm_path) +
a61af66fc99e Initial load
duke
parents:
diff changeset
2394 strlen(os::file_separator()) + 20);
a61af66fc99e Initial load
duke
parents:
diff changeset
2395 if (shared_archive_path == NULL) return JNI_ENOMEM;
a61af66fc99e Initial load
duke
parents:
diff changeset
2396 strcpy(shared_archive_path, jvm_path);
a61af66fc99e Initial load
duke
parents:
diff changeset
2397 strcat(shared_archive_path, os::file_separator());
a61af66fc99e Initial load
duke
parents:
diff changeset
2398 strcat(shared_archive_path, "classes");
a61af66fc99e Initial load
duke
parents:
diff changeset
2399 DEBUG_ONLY(strcat(shared_archive_path, "_g");)
a61af66fc99e Initial load
duke
parents:
diff changeset
2400 strcat(shared_archive_path, ".jsa");
a61af66fc99e Initial load
duke
parents:
diff changeset
2401 SharedArchivePath = shared_archive_path;
a61af66fc99e Initial load
duke
parents:
diff changeset
2402
a61af66fc99e Initial load
duke
parents:
diff changeset
2403 // Remaining part of option string
a61af66fc99e Initial load
duke
parents:
diff changeset
2404 const char* tail;
a61af66fc99e Initial load
duke
parents:
diff changeset
2405
a61af66fc99e Initial load
duke
parents:
diff changeset
2406 // If flag "-XX:Flags=flags-file" is used it will be the first option to be processed.
a61af66fc99e Initial load
duke
parents:
diff changeset
2407 bool settings_file_specified = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2408 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2409 for (index = 0; index < args->nOptions; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2410 const JavaVMOption *option = args->options + index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2411 if (match_option(option, "-XX:Flags=", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2412 if (!process_settings_file(tail, true, args->ignoreUnrecognized)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2413 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2414 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2415 settings_file_specified = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2417 if (match_option(option, "-XX:+PrintVMOptions", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2418 PrintVMOptions = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2420 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2421
a61af66fc99e Initial load
duke
parents:
diff changeset
2422 // Parse default .hotspotrc settings file
a61af66fc99e Initial load
duke
parents:
diff changeset
2423 if (!settings_file_specified) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2424 if (!process_settings_file(".hotspotrc", false, args->ignoreUnrecognized)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2425 return JNI_EINVAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2428
a61af66fc99e Initial load
duke
parents:
diff changeset
2429 if (PrintVMOptions) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2430 for (index = 0; index < args->nOptions; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2431 const JavaVMOption *option = args->options + index;
a61af66fc99e Initial load
duke
parents:
diff changeset
2432 if (match_option(option, "-XX:", &tail)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2433 logOption(tail);
a61af66fc99e Initial load
duke
parents:
diff changeset
2434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2435 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2436 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2437
a61af66fc99e Initial load
duke
parents:
diff changeset
2438 // Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS
a61af66fc99e Initial load
duke
parents:
diff changeset
2439 jint result = parse_vm_init_args(args);
a61af66fc99e Initial load
duke
parents:
diff changeset
2440 if (result != JNI_OK) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2441 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
2442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2443
a61af66fc99e Initial load
duke
parents:
diff changeset
2444 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2445 if (TraceBytecodesAt != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2446 TraceBytecodes = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2448 if (CountCompiledCalls) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2449 if (UseCounterDecay) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2450 warning("UseCounterDecay disabled because CountCalls is set");
a61af66fc99e Initial load
duke
parents:
diff changeset
2451 UseCounterDecay = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2454 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
2455
a61af66fc99e Initial load
duke
parents:
diff changeset
2456 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2457 // Turn on -verbose:gc options as well
a61af66fc99e Initial load
duke
parents:
diff changeset
2458 PrintGC = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2459 if (FLAG_IS_DEFAULT(TraceClassUnloading)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2460 TraceClassUnloading = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2462 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2463
a61af66fc99e Initial load
duke
parents:
diff changeset
2464 #ifdef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
2465 set_serial_gc_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2466 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
2467 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
2468 no_shared_spaces();
a61af66fc99e Initial load
duke
parents:
diff changeset
2469 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
2470
a61af66fc99e Initial load
duke
parents:
diff changeset
2471 // Set flags based on ergonomics.
a61af66fc99e Initial load
duke
parents:
diff changeset
2472 set_ergonomics_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2473
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2474 // Check the GC selections again.
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2475 if (!check_gc_consistency()) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2476 return JNI_EINVAL;
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2477 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2478
13
183f41cf8bfe 6557851: CMS: ergonomics defaults are not set with FLAG_SET_ERGO
jmasa
parents: 10
diff changeset
2479 if (UseParallelGC || UseParallelOldGC) {
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2480 // Set some flags for ParallelGC if needed.
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2481 set_parallel_gc_flags();
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2482 } else if (UseConcMarkSweepGC) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2483 // Set some flags for CMS
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2484 set_cms_and_parnew_gc_flags();
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2485 } else if (UseParNewGC) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2486 // Set some flags for ParNew
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2487 set_parnew_gc_flags();
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2488 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2489
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2490 #ifdef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
2491 assert(verify_serial_gc_flags(), "SerialGC unset");
a61af66fc99e Initial load
duke
parents:
diff changeset
2492 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
2493
a61af66fc99e Initial load
duke
parents:
diff changeset
2494 // Set bytecode rewriting flags
a61af66fc99e Initial load
duke
parents:
diff changeset
2495 set_bytecode_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2496
a61af66fc99e Initial load
duke
parents:
diff changeset
2497 // Set flags if Aggressive optimization flags (-XX:+AggressiveOpts) enabled.
a61af66fc99e Initial load
duke
parents:
diff changeset
2498 set_aggressive_opts_flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2499
a61af66fc99e Initial load
duke
parents:
diff changeset
2500 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
2501 // Biased locking is not implemented with c++ interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
2502 FLAG_SET_DEFAULT(UseBiasedLocking, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
2503 #endif /* CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
2504
a61af66fc99e Initial load
duke
parents:
diff changeset
2505 if (PrintCommandLineFlags) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2506 CommandLineFlags::printSetFlags();
a61af66fc99e Initial load
duke
parents:
diff changeset
2507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2508
10
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2509 #ifdef ASSERT
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2510 if (PrintFlagsFinal) {
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2511 CommandLineFlags::printFlags();
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2512 }
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2513 #endif
28372612af5e 6362677: Change parallel GC collector default number of parallel GC threads.
jmasa
parents: 0
diff changeset
2514
0
a61af66fc99e Initial load
duke
parents:
diff changeset
2515 return JNI_OK;
a61af66fc99e Initial load
duke
parents:
diff changeset
2516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2517
a61af66fc99e Initial load
duke
parents:
diff changeset
2518 int Arguments::PropertyList_count(SystemProperty* pl) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2519 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2520 while(pl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2521 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2522 pl = pl->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2524 return count;
a61af66fc99e Initial load
duke
parents:
diff changeset
2525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2526
a61af66fc99e Initial load
duke
parents:
diff changeset
2527 const char* Arguments::PropertyList_get_value(SystemProperty *pl, const char* key) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2528 assert(key != NULL, "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
2529 SystemProperty* prop;
a61af66fc99e Initial load
duke
parents:
diff changeset
2530 for (prop = pl; prop != NULL; prop = prop->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2531 if (strcmp(key, prop->key()) == 0) return prop->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
2532 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2533 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2534 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2535
a61af66fc99e Initial load
duke
parents:
diff changeset
2536 const char* Arguments::PropertyList_get_key_at(SystemProperty *pl, int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2537 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2538 const char* ret_val = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2539
a61af66fc99e Initial load
duke
parents:
diff changeset
2540 while(pl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2541 if(count >= index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2542 ret_val = pl->key();
a61af66fc99e Initial load
duke
parents:
diff changeset
2543 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2545 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2546 pl = pl->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2547 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2548
a61af66fc99e Initial load
duke
parents:
diff changeset
2549 return ret_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
2550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2551
a61af66fc99e Initial load
duke
parents:
diff changeset
2552 char* Arguments::PropertyList_get_value_at(SystemProperty* pl, int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2553 int count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2554 char* ret_val = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
2555
a61af66fc99e Initial load
duke
parents:
diff changeset
2556 while(pl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2557 if(count >= index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2558 ret_val = pl->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
2559 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2561 count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2562 pl = pl->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2564
a61af66fc99e Initial load
duke
parents:
diff changeset
2565 return ret_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
2566 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2567
a61af66fc99e Initial load
duke
parents:
diff changeset
2568 void Arguments::PropertyList_add(SystemProperty** plist, SystemProperty *new_p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2569 SystemProperty* p = *plist;
a61af66fc99e Initial load
duke
parents:
diff changeset
2570 if (p == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2571 *plist = new_p;
a61af66fc99e Initial load
duke
parents:
diff changeset
2572 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2573 while (p->next() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2574 p = p->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
2575 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2576 p->set_next(new_p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2577 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2578 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2579
a61af66fc99e Initial load
duke
parents:
diff changeset
2580 void Arguments::PropertyList_add(SystemProperty** plist, const char* k, char* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2581 if (plist == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2582 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2583
a61af66fc99e Initial load
duke
parents:
diff changeset
2584 SystemProperty* new_p = new SystemProperty(k, v, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
2585 PropertyList_add(plist, new_p);
a61af66fc99e Initial load
duke
parents:
diff changeset
2586 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2587
a61af66fc99e Initial load
duke
parents:
diff changeset
2588 // This add maintains unique property key in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
2589 void Arguments::PropertyList_unique_add(SystemProperty** plist, const char* k, char* v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2590 if (plist == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
2591 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2592
a61af66fc99e Initial load
duke
parents:
diff changeset
2593 // If property key exist then update with new value.
a61af66fc99e Initial load
duke
parents:
diff changeset
2594 SystemProperty* prop;
a61af66fc99e Initial load
duke
parents:
diff changeset
2595 for (prop = *plist; prop != NULL; prop = prop->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2596 if (strcmp(k, prop->key()) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2597 prop->set_value(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
2598 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
2599 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2601
a61af66fc99e Initial load
duke
parents:
diff changeset
2602 PropertyList_add(plist, k, v);
a61af66fc99e Initial load
duke
parents:
diff changeset
2603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2604
a61af66fc99e Initial load
duke
parents:
diff changeset
2605 #ifdef KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
2606 char *Arguments::get_kernel_properties() {
a61af66fc99e Initial load
duke
parents:
diff changeset
2607 // Find properties starting with kernel and append them to string
a61af66fc99e Initial load
duke
parents:
diff changeset
2608 // We need to find out how long they are first because the URL's that they
a61af66fc99e Initial load
duke
parents:
diff changeset
2609 // might point to could get long.
a61af66fc99e Initial load
duke
parents:
diff changeset
2610 int length = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2611 SystemProperty* prop;
a61af66fc99e Initial load
duke
parents:
diff changeset
2612 for (prop = _system_properties; prop != NULL; prop = prop->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2613 if (strncmp(prop->key(), "kernel.", 7 ) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2614 length += (strlen(prop->key()) + strlen(prop->value()) + 5); // "-D ="
a61af66fc99e Initial load
duke
parents:
diff changeset
2615 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2617 // Add one for null terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
2618 char *props = AllocateHeap(length + 1, "get_kernel_properties");
a61af66fc99e Initial load
duke
parents:
diff changeset
2619 if (length != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2620 int pos = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
2621 for (prop = _system_properties; prop != NULL; prop = prop->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2622 if (strncmp(prop->key(), "kernel.", 7 ) == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2623 jio_snprintf(&props[pos], length-pos,
a61af66fc99e Initial load
duke
parents:
diff changeset
2624 "-D%s=%s ", prop->key(), prop->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
2625 pos = strlen(props);
a61af66fc99e Initial load
duke
parents:
diff changeset
2626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2628 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2629 // null terminate props in case of null
a61af66fc99e Initial load
duke
parents:
diff changeset
2630 props[length] = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
2631 return props;
a61af66fc99e Initial load
duke
parents:
diff changeset
2632 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2633 #endif // KERNEL
a61af66fc99e Initial load
duke
parents:
diff changeset
2634
a61af66fc99e Initial load
duke
parents:
diff changeset
2635 // Copies src into buf, replacing "%%" with "%" and "%p" with pid
a61af66fc99e Initial load
duke
parents:
diff changeset
2636 // Returns true if all of the source pointed by src has been copied over to
a61af66fc99e Initial load
duke
parents:
diff changeset
2637 // the destination buffer pointed by buf. Otherwise, returns false.
a61af66fc99e Initial load
duke
parents:
diff changeset
2638 // Notes:
a61af66fc99e Initial load
duke
parents:
diff changeset
2639 // 1. If the length (buflen) of the destination buffer excluding the
a61af66fc99e Initial load
duke
parents:
diff changeset
2640 // NULL terminator character is not long enough for holding the expanded
a61af66fc99e Initial load
duke
parents:
diff changeset
2641 // pid characters, it also returns false instead of returning the partially
a61af66fc99e Initial load
duke
parents:
diff changeset
2642 // expanded one.
a61af66fc99e Initial load
duke
parents:
diff changeset
2643 // 2. The passed in "buflen" should be large enough to hold the null terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
2644 bool Arguments::copy_expand_pid(const char* src, size_t srclen,
a61af66fc99e Initial load
duke
parents:
diff changeset
2645 char* buf, size_t buflen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2646 const char* p = src;
a61af66fc99e Initial load
duke
parents:
diff changeset
2647 char* b = buf;
a61af66fc99e Initial load
duke
parents:
diff changeset
2648 const char* src_end = &src[srclen];
a61af66fc99e Initial load
duke
parents:
diff changeset
2649 char* buf_end = &buf[buflen - 1];
a61af66fc99e Initial load
duke
parents:
diff changeset
2650
a61af66fc99e Initial load
duke
parents:
diff changeset
2651 while (p < src_end && b < buf_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2652 if (*p == '%') {
a61af66fc99e Initial load
duke
parents:
diff changeset
2653 switch (*(++p)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2654 case '%': // "%%" ==> "%"
a61af66fc99e Initial load
duke
parents:
diff changeset
2655 *b++ = *p++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2656 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2657 case 'p': { // "%p" ==> current process id
a61af66fc99e Initial load
duke
parents:
diff changeset
2658 // buf_end points to the character before the last character so
a61af66fc99e Initial load
duke
parents:
diff changeset
2659 // that we could write '\0' to the end of the buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2660 size_t buf_sz = buf_end - b + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
2661 int ret = jio_snprintf(b, buf_sz, "%d", os::current_process_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
2662
a61af66fc99e Initial load
duke
parents:
diff changeset
2663 // if jio_snprintf fails or the buffer is not long enough to hold
a61af66fc99e Initial load
duke
parents:
diff changeset
2664 // the expanded pid, returns false.
a61af66fc99e Initial load
duke
parents:
diff changeset
2665 if (ret < 0 || ret >= (int)buf_sz) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2666 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
2667 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2668 b += ret;
a61af66fc99e Initial load
duke
parents:
diff changeset
2669 assert(*b == '\0', "fail in copy_expand_pid");
a61af66fc99e Initial load
duke
parents:
diff changeset
2670 if (p == src_end && b == buf_end + 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
2671 // reach the end of the buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
2672 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
2673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2674 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2675 p++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2676 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
2677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2678 default :
a61af66fc99e Initial load
duke
parents:
diff changeset
2679 *b++ = '%';
a61af66fc99e Initial load
duke
parents:
diff changeset
2680 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2681 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
2682 *b++ = *p++;
a61af66fc99e Initial load
duke
parents:
diff changeset
2683 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
2685 *b = '\0';
a61af66fc99e Initial load
duke
parents:
diff changeset
2686 return (p == src_end); // return false if not all of the source was copied
a61af66fc99e Initial load
duke
parents:
diff changeset
2687 }