src/share/vm/runtime/arguments.cpp

Thu, 09 May 2013 11:16:39 -0700

author
johnc
date
Thu, 09 May 2013 11:16:39 -0700
changeset 5078
194f52aa2f23
parent 5073
d17700c82d7d
child 5096
735c995bf1a1
child 5112
8bcfd9ce2c6b
child 5119
12f651e29f6b
permissions
-rw-r--r--

7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
Summary: Refactor G1's hot card cache and card counts table into their own files. Simplify the card counts table, including removing the encoding of the card index in each entry. The card counts table now has a 1:1 correspondence with the cards spanned by heap. Space for the card counts table is reserved from virtual memory (rather than C heap) during JVM startup and is committed/expanded when the heap is expanded. Changes were also reviewed-by Vitaly Davidovich.
Reviewed-by: tschatzl, jmasa

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

mercurial