src/share/vm/runtime/arguments.cpp

Wed, 27 Mar 2013 19:21:18 +0100

author
tschatzl
date
Wed, 27 Mar 2013 19:21:18 +0100
changeset 4854
754c24457b20
parent 4824
7f16d1812865
child 4858
15c04fe93c18
permissions
-rw-r--r--

7112912: Message "Error occurred during initialization of VM" on boxes with lots of RAM
Summary: Ergonomics now also takes available virtual memory into account when deciding for a heap size. The helper method to determine the maximum allocatable memory block now uses the appropriate OS specific calls to retrieve available virtual memory for the java process. In 32 bit environments this method now also searches for the maximum actually reservable amount of memory. Merge previously separate implementations for Linux/BSD/Solaris into a single method.
Reviewed-by: jmasa, tamao

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

mercurial