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