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