blob: 67a9661b8ae2469fb99ce4d4bac94bc9c8ffd65d [file] [log] [blame]
J. Duke81537792007-12-01 00:00:00 +00001/*
Max Ockner45b28572016-01-13 14:56:17 -05002 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
J. Duke81537792007-12-01 00:00:00 +00003 * 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 *
Erik Trimbleba7c1732010-05-27 19:08:38 -070019 * 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.
J. Duke81537792007-12-01 00:00:00 +000022 *
23 */
24
Stefan Karlsson8006fe82010-11-23 13:22:55 -080025#ifndef SHARE_VM_RUNTIME_ARGUMENTS_HPP
26#define SHARE_VM_RUNTIME_ARGUMENTS_HPP
27
Max Ockner45b28572016-01-13 14:56:17 -050028#include "logging/logLevel.hpp"
29#include "logging/logTag.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080030#include "runtime/java.hpp"
Goetz Lindenmaierf2051ed2014-06-26 16:05:15 +020031#include "runtime/os.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080032#include "runtime/perfData.hpp"
Jesper Wilhelmsson53015342014-01-29 23:17:05 +010033#include "utilities/debug.hpp"
Stefan Karlsson8006fe82010-11-23 13:22:55 -080034#include "utilities/top.hpp"
35
J. Duke81537792007-12-01 00:00:00 +000036// Arguments parses the command line and recognizes options
37
38// Invocation API hook typedefs (these should really be defined in jni.hpp)
39extern "C" {
40 typedef void (JNICALL *abort_hook_t)(void);
41 typedef void (JNICALL *exit_hook_t)(jint code);
David Chase305ec3b2014-05-09 16:50:54 -040042 typedef jint (JNICALL *vfprintf_hook_t)(FILE *fp, const char *format, va_list args) ATTRIBUTE_PRINTF(2, 0);
J. Duke81537792007-12-01 00:00:00 +000043}
44
45// Forward declarations
Alan Batemanf30fc1c2016-03-17 19:04:01 +000046class ArgumentBootClassPath;
J. Duke81537792007-12-01 00:00:00 +000047
Alan Batemanf30fc1c2016-03-17 19:04:01 +000048// PathString is used as the underlying value container for a
49// SystemProperty and for the string that represents the system
50// boot class path, Arguments::_system_boot_class_path.
51class PathString : public CHeapObj<mtInternal> {
52 protected:
J. Duke81537792007-12-01 00:00:00 +000053 char* _value;
J. Duke81537792007-12-01 00:00:00 +000054 public:
J. Duke81537792007-12-01 00:00:00 +000055 char* value() const { return _value; }
Alan Batemanf30fc1c2016-03-17 19:04:01 +000056
Dmitry Dmitriev237449b2015-08-28 17:32:31 +030057 bool set_value(const char *value) {
Alan Batemanf30fc1c2016-03-17 19:04:01 +000058 if (_value != NULL) {
59 FreeHeap(_value);
J. Duke81537792007-12-01 00:00:00 +000060 }
Alan Batemanf30fc1c2016-03-17 19:04:01 +000061 _value = AllocateHeap(strlen(value)+1, mtInternal);
62 assert(_value != NULL, "Unable to allocate space for new path value");
63 if (_value != NULL) {
64 strcpy(_value, value);
65 } else {
66 // not able to allocate
67 return false;
68 }
69 return true;
J. Duke81537792007-12-01 00:00:00 +000070 }
71
72 void append_value(const char *value) {
73 char *sp;
74 size_t len = 0;
75 if (value != NULL) {
76 len = strlen(value);
77 if (_value != NULL) {
78 len += strlen(_value);
79 }
Zhengyu Gua39b1762012-06-28 17:03:16 -040080 sp = AllocateHeap(len+2, mtInternal);
Alan Batemanf30fc1c2016-03-17 19:04:01 +000081 assert(sp != NULL, "Unable to allocate space for new append path value");
J. Duke81537792007-12-01 00:00:00 +000082 if (sp != NULL) {
83 if (_value != NULL) {
84 strcpy(sp, _value);
85 strcat(sp, os::path_separator());
86 strcat(sp, value);
87 FreeHeap(_value);
88 } else {
89 strcpy(sp, value);
90 }
91 _value = sp;
92 }
93 }
94 }
95
96 // Constructor
Alan Batemanf30fc1c2016-03-17 19:04:01 +000097 PathString(const char* value) {
J. Duke81537792007-12-01 00:00:00 +000098 if (value == NULL) {
99 _value = NULL;
100 } else {
Zhengyu Gua39b1762012-06-28 17:03:16 -0400101 _value = AllocateHeap(strlen(value)+1, mtInternal);
J. Duke81537792007-12-01 00:00:00 +0000102 strcpy(_value, value);
103 }
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000104 }
105};
106
107// Element describing System and User (-Dkey=value flags) defined property.
108//
109// An internal SystemProperty is one that has been removed in
110// jdk.internal.VM.saveAndRemoveProperties, like jdk.boot.class.path.append.
111//
112class SystemProperty : public PathString {
113 private:
114 char* _key;
115 SystemProperty* _next;
116 bool _internal;
117 bool _writeable;
118 bool writeable() { return _writeable; }
119
120 public:
121 // Accessors
122 char* value() const { return PathString::value(); }
123 const char* key() const { return _key; }
124 bool internal() const { return _internal; }
125 SystemProperty* next() const { return _next; }
126 void set_next(SystemProperty* next) { _next = next; }
127
128 // A system property should only have its value set
129 // via an external interface if it is a writeable property.
130 // The internal, non-writeable property jdk.boot.class.path.append
131 // is the only exception to this rule. It can be set externally
132 // via -Xbootclasspath/a or JVMTI OnLoad phase call to AddToBootstrapClassLoaderSearch.
133 // In those cases for jdk.boot.class.path.append, the base class
134 // set_value and append_value methods are called directly.
135 bool set_writeable_value(const char *value) {
136 if (writeable()) {
137 return set_value(value);
138 }
139 return false;
140 }
141
142 // Constructor
143 SystemProperty(const char* key, const char* value, bool writeable, bool internal = false) : PathString(value) {
144 if (key == NULL) {
145 _key = NULL;
146 } else {
147 _key = AllocateHeap(strlen(key)+1, mtInternal);
148 strcpy(_key, key);
149 }
J. Duke81537792007-12-01 00:00:00 +0000150 _next = NULL;
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000151 _internal = internal;
J. Duke81537792007-12-01 00:00:00 +0000152 _writeable = writeable;
153 }
154};
155
156
157// For use by -agentlib, -agentpath and -Xrun
Zhengyu Gua39b1762012-06-28 17:03:16 -0400158class AgentLibrary : public CHeapObj<mtInternal> {
J. Duke81537792007-12-01 00:00:00 +0000159 friend class AgentLibraryList;
Bill Pittore993de8b2013-08-23 20:33:02 -0400160public:
161 // Is this library valid or not. Don't rely on os_lib == NULL as statically
162 // linked lib could have handle of RTLD_DEFAULT which == 0 on some platforms
163 enum AgentState {
164 agent_invalid = 0,
165 agent_valid = 1
166 };
167
J. Duke81537792007-12-01 00:00:00 +0000168 private:
169 char* _name;
170 char* _options;
171 void* _os_lib;
172 bool _is_absolute_path;
Bill Pittore993de8b2013-08-23 20:33:02 -0400173 bool _is_static_lib;
174 AgentState _state;
J. Duke81537792007-12-01 00:00:00 +0000175 AgentLibrary* _next;
176
177 public:
178 // Accessors
179 const char* name() const { return _name; }
180 char* options() const { return _options; }
181 bool is_absolute_path() const { return _is_absolute_path; }
182 void* os_lib() const { return _os_lib; }
183 void set_os_lib(void* os_lib) { _os_lib = os_lib; }
184 AgentLibrary* next() const { return _next; }
Bill Pittore993de8b2013-08-23 20:33:02 -0400185 bool is_static_lib() const { return _is_static_lib; }
Bill Pittore091edb42013-09-11 20:03:34 -0400186 void set_static_lib(bool is_static_lib) { _is_static_lib = is_static_lib; }
Bill Pittore993de8b2013-08-23 20:33:02 -0400187 bool valid() { return (_state == agent_valid); }
188 void set_valid() { _state = agent_valid; }
189 void set_invalid() { _state = agent_invalid; }
J. Duke81537792007-12-01 00:00:00 +0000190
191 // Constructor
192 AgentLibrary(const char* name, const char* options, bool is_absolute_path, void* os_lib) {
Zhengyu Gua39b1762012-06-28 17:03:16 -0400193 _name = AllocateHeap(strlen(name)+1, mtInternal);
J. Duke81537792007-12-01 00:00:00 +0000194 strcpy(_name, name);
195 if (options == NULL) {
196 _options = NULL;
197 } else {
Zhengyu Gua39b1762012-06-28 17:03:16 -0400198 _options = AllocateHeap(strlen(options)+1, mtInternal);
J. Duke81537792007-12-01 00:00:00 +0000199 strcpy(_options, options);
200 }
201 _is_absolute_path = is_absolute_path;
202 _os_lib = os_lib;
203 _next = NULL;
Bill Pittore993de8b2013-08-23 20:33:02 -0400204 _state = agent_invalid;
205 _is_static_lib = false;
J. Duke81537792007-12-01 00:00:00 +0000206 }
207};
208
209// maintain an order of entry list of AgentLibrary
210class AgentLibraryList VALUE_OBJ_CLASS_SPEC {
211 private:
212 AgentLibrary* _first;
213 AgentLibrary* _last;
214 public:
215 bool is_empty() const { return _first == NULL; }
216 AgentLibrary* first() const { return _first; }
217
218 // add to the end of the list
219 void add(AgentLibrary* lib) {
220 if (is_empty()) {
221 _first = _last = lib;
222 } else {
223 _last->_next = lib;
224 _last = lib;
225 }
226 lib->_next = NULL;
227 }
228
229 // search for and remove a library known to be in the list
230 void remove(AgentLibrary* lib) {
231 AgentLibrary* curr;
232 AgentLibrary* prev = NULL;
233 for (curr = first(); curr != NULL; prev = curr, curr = curr->next()) {
234 if (curr == lib) {
235 break;
236 }
237 }
238 assert(curr != NULL, "always should be found");
239
240 if (curr != NULL) {
241 // it was found, by-pass this library
242 if (prev == NULL) {
243 _first = curr->_next;
244 } else {
245 prev->_next = curr->_next;
246 }
247 if (curr == _last) {
248 _last = prev;
249 }
250 curr->_next = NULL;
251 }
252 }
253
254 AgentLibraryList() {
255 _first = NULL;
256 _last = NULL;
257 }
258};
259
Jeremy Manson8d6eb322015-07-17 19:40:21 -0400260// Helper class for controlling the lifetime of JavaVMInitArgs objects.
261class ScopedVMInitArgs;
J. Duke81537792007-12-01 00:00:00 +0000262
Max Ockner45b28572016-01-13 14:56:17 -0500263// Most logging functions require 5 tags. Some of them may be _NO_TAG.
264typedef struct {
265 const char* alias_name;
266 LogLevelType level;
267 bool exactMatch;
268 LogTagType tag;
269} AliasedLoggingFlag;
270
J. Duke81537792007-12-01 00:00:00 +0000271class Arguments : AllStatic {
272 friend class VMStructs;
273 friend class JvmtiExport;
Bertrand Delsart5aec2dc2015-07-01 10:53:26 +0200274 friend class CodeCacheExtensions;
J. Duke81537792007-12-01 00:00:00 +0000275 public:
276 // Operation modi
277 enum Mode {
278 _int, // corresponds to -Xint
279 _mixed, // corresponds to -Xmixed
280 _comp // corresponds to -Xcomp
281 };
282
283 enum ArgsRange {
284 arg_unreadable = -3,
285 arg_too_small = -2,
286 arg_too_big = -1,
287 arg_in_range = 0
288 };
289
290 private:
291
Ron Durbin409697a2015-11-11 14:57:27 -0800292 // a pointer to the flags file name if it is specified
293 static char* _jvm_flags_file;
J. Duke81537792007-12-01 00:00:00 +0000294 // an array containing all flags specified in the .hotspotrc file
295 static char** _jvm_flags_array;
296 static int _num_jvm_flags;
297 // an array containing all jvm arguments specified in the command line
298 static char** _jvm_args_array;
299 static int _num_jvm_args;
300 // string containing all java command (class/jarfile name and app args)
301 static char* _java_command;
302
303 // Property list
304 static SystemProperty* _system_properties;
305
306 // Quick accessor to System properties in the list:
J. Duke81537792007-12-01 00:00:00 +0000307 static SystemProperty *_sun_boot_library_path;
308 static SystemProperty *_java_library_path;
309 static SystemProperty *_java_home;
310 static SystemProperty *_java_class_path;
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000311 static SystemProperty *_jdk_boot_class_path_append;
312
313 // The constructed value of the system class path after
314 // argument processing and JVMTI OnLoad additions via
315 // calls to AddToBootstrapClassLoaderSearch. This is the
316 // final form before ClassLoader::setup_bootstrap_search().
317 static PathString *_system_boot_class_path;
J. Duke81537792007-12-01 00:00:00 +0000318
Chris Hegarty393a39a2014-12-03 14:21:14 +0000319 // temporary: to emit warning if the default ext dirs are not empty.
320 // remove this variable when the warning is no longer needed.
321 static char* _ext_dirs;
322
J. Duke81537792007-12-01 00:00:00 +0000323 // java.vendor.url.bug, bug reporting URL for fatal errors.
324 static const char* _java_vendor_url_bug;
325
326 // sun.java.launcher, private property to provide information about
Ron Durbin97d55c82014-01-30 14:12:22 -0800327 // java launcher
J. Duke81537792007-12-01 00:00:00 +0000328 static const char* _sun_java_launcher;
329
330 // sun.java.launcher.pid, private property
331 static int _sun_java_launcher_pid;
332
Ron Durbin97d55c82014-01-30 14:12:22 -0800333 // was this VM created via the -XXaltjvm=<path> option
334 static bool _sun_java_launcher_is_altjvm;
Staffan Larsencc6f4612011-02-28 14:19:52 +0100335
J. Duke81537792007-12-01 00:00:00 +0000336 // Option flags
337 static bool _has_profile;
Bengt Rutisson31ca2b72016-01-28 10:04:35 +0100338 static const char* _gc_log_filename;
Thomas Schatzl962008f2013-09-11 16:25:02 +0200339 // Value of the conservative maximum heap alignment needed
340 static size_t _conservative_max_heap_alignment;
341
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000342 static uintx _min_heap_size;
Jesper Wilhelmsson9390fa32014-09-16 16:02:32 +0200343
J. Duke81537792007-12-01 00:00:00 +0000344 // -Xrun arguments
345 static AgentLibraryList _libraryList;
346 static void add_init_library(const char* name, char* options)
347 { _libraryList.add(new AgentLibrary(name, options, false, NULL)); }
348
349 // -agentlib and -agentpath arguments
350 static AgentLibraryList _agentList;
351 static void add_init_agent(const char* name, char* options, bool absolute_path)
352 { _agentList.add(new AgentLibrary(name, options, absolute_path, NULL)); }
353
354 // Late-binding agents not started via arguments
Bill Pittore993de8b2013-08-23 20:33:02 -0400355 static void add_loaded_agent(AgentLibrary *agentLib)
356 { _agentList.add(agentLib); }
J. Duke81537792007-12-01 00:00:00 +0000357 static void add_loaded_agent(const char* name, char* options, bool absolute_path, void* os_lib)
358 { _agentList.add(new AgentLibrary(name, options, absolute_path, os_lib)); }
359
360 // Operation modi
361 static Mode _mode;
362 static void set_mode_flags(Mode mode);
363 static bool _java_compiler;
364 static void set_java_compiler(bool arg) { _java_compiler = arg; }
365 static bool java_compiler() { return _java_compiler; }
366
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000367 // Capture the index location of -Xbootclasspath\a within sysclasspath.
368 // Used when setting up the bootstrap search path in order to
369 // mark the boot loader's append path observability boundary.
370 static int _bootclassloader_append_index;
371
372 // -Xpatch flag
373 static char** _patch_dirs;
374 static int _patch_dirs_count;
375 static void set_patch_dirs(char** dirs) { _patch_dirs = dirs; }
376 static void set_patch_dirs_count(int count) { _patch_dirs_count = count; }
377
J. Duke81537792007-12-01 00:00:00 +0000378 // -Xdebug flag
379 static bool _xdebug_mode;
380 static void set_xdebug_mode(bool arg) { _xdebug_mode = arg; }
381 static bool xdebug_mode() { return _xdebug_mode; }
382
383 // Used to save default settings
384 static bool _AlwaysCompileLoopMethods;
385 static bool _UseOnStackReplacement;
386 static bool _BackgroundCompilation;
387 static bool _ClipInlining;
388 static bool _CIDynamicCompilePriority;
Roland Westrelinb81d6062015-03-23 17:09:41 +0100389 static intx _Tier3InvokeNotifyFreqLog;
390 static intx _Tier4InvocationThreshold;
J. Duke81537792007-12-01 00:00:00 +0000391
Igor Veresov2c66a6c2010-09-03 17:51:07 -0700392 // Tiered
393 static void set_tiered_flags();
J. Duke81537792007-12-01 00:00:00 +0000394 // CMS/ParNew garbage collectors
395 static void set_parnew_gc_flags();
396 static void set_cms_and_parnew_gc_flags();
Y. Srinivas Ramakrishna18f33862008-06-05 15:57:56 -0700397 // UseParallel[Old]GC
J. Duke81537792007-12-01 00:00:00 +0000398 static void set_parallel_gc_flags();
Y. Srinivas Ramakrishna18f33862008-06-05 15:57:56 -0700399 // Garbage-First (UseG1GC)
400 static void set_g1_gc_flags();
J. Duke81537792007-12-01 00:00:00 +0000401 // GC ergonomics
Thomas Schatzl962008f2013-09-11 16:25:02 +0200402 static void set_conservative_max_heap_alignment();
Bengt Rutissonc51ea962013-03-12 08:33:57 +0100403 static void set_use_compressed_oops();
Harold Seigel4d91f4e2013-08-15 20:04:10 -0400404 static void set_use_compressed_klass_ptrs();
John Coomes100e5852014-09-04 16:53:27 -0700405 static void select_gc();
J. Duke81537792007-12-01 00:00:00 +0000406 static void set_ergonomics_flags();
John Coomesc295eb22011-03-06 11:37:18 -0800407 static void set_shared_spaces_flags();
Thomas Schatzlbb5bd502013-03-27 19:21:18 +0100408 // limits the given memory size by the maximum amount of memory this process is
409 // currently allowed to allocate or reserve.
410 static julong limit_by_allocatable_memory(julong size);
Paul Hohensee2f7d60f2009-10-28 16:25:51 -0400411 // Setup heap size
412 static void set_heap_size();
J. Duke81537792007-12-01 00:00:00 +0000413 // Based on automatic selection criteria, should the
414 // low pause collector be used.
415 static bool should_auto_select_low_pause_collector();
416
417 // Bytecode rewriting
418 static void set_bytecode_flags();
419
420 // Invocation API hooks
421 static abort_hook_t _abort_hook;
422 static exit_hook_t _exit_hook;
423 static vfprintf_hook_t _vfprintf_hook;
424
425 // System properties
426 static bool add_property(const char* prop);
427
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000428 // Miscellaneous system property setter
429 static bool append_to_addmods_property(const char* module_name);
430
J. Duke81537792007-12-01 00:00:00 +0000431 // Aggressive optimization flags.
Dmitry Dmitriev237449b2015-08-28 17:32:31 +0300432 static jint set_aggressive_opts_flags();
J. Duke81537792007-12-01 00:00:00 +0000433
Derek White23813ce2015-09-11 15:31:03 -0400434 static jint set_aggressive_heap_flags();
435
J. Duke81537792007-12-01 00:00:00 +0000436 // Argument parsing
437 static void do_pd_flag_adjustments();
Christian Thalingercd7bfac2013-09-26 12:07:53 -0700438 static bool parse_argument(const char* arg, Flag::Flags origin);
439 static bool process_argument(const char* arg, jboolean ignore_unrecognized, Flag::Flags origin);
J. Duke81537792007-12-01 00:00:00 +0000440 static void process_java_launcher_argument(const char*, void*);
Dmitry Dmitriev237449b2015-08-28 17:32:31 +0300441 static void process_java_compiler_argument(const char* arg);
Jeremy Manson8d6eb322015-07-17 19:40:21 -0400442 static jint parse_options_environment_variable(const char* name, ScopedVMInitArgs* vm_args);
443 static jint parse_java_tool_options_environment_variable(ScopedVMInitArgs* vm_args);
444 static jint parse_java_options_environment_variable(ScopedVMInitArgs* vm_args);
Ron Durbinbe89d722015-09-04 14:49:20 -0700445 static jint parse_vm_options_file(const char* file_name, ScopedVMInitArgs* vm_args);
446 static jint parse_options_buffer(const char* name, char* buffer, const size_t buf_len, ScopedVMInitArgs* vm_args);
447 static jint insert_vm_options_file(const JavaVMInitArgs* args,
Ron Durbin00f6aa52016-01-08 15:38:08 -0800448 const char* vm_options_file,
Ron Durbinbe89d722015-09-04 14:49:20 -0700449 const int vm_options_file_pos,
450 ScopedVMInitArgs* vm_options_file_args,
451 ScopedVMInitArgs* args_out);
Ron Durbin00f6aa52016-01-08 15:38:08 -0800452 static bool args_contains_vm_options_file_arg(const JavaVMInitArgs* args);
453 static jint expand_vm_options_as_needed(const JavaVMInitArgs* args_in,
454 ScopedVMInitArgs* mod_args,
455 JavaVMInitArgs** args_out);
Ron Durbinbe89d722015-09-04 14:49:20 -0700456 static jint match_special_option_and_act(const JavaVMInitArgs* args,
Ron Durbinbe89d722015-09-04 14:49:20 -0700457 ScopedVMInitArgs* args_out);
458
Bengt Rutisson31ca2b72016-01-28 10:04:35 +0100459 static bool handle_deprecated_print_gc_flags();
460
Jeremy Manson8d6eb322015-07-17 19:40:21 -0400461 static jint parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
462 const JavaVMInitArgs *java_options_args,
463 const JavaVMInitArgs *cmd_line_args);
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000464 static jint parse_each_vm_init_arg(const JavaVMInitArgs* args, ArgumentBootClassPath* bcp_p, bool* bcp_assembly_required_p, Flag::Flags origin);
465 static jint finalize_vm_init_args(ArgumentBootClassPath* bcp_p, bool bcp_assembly_required);
Jesper Wilhelmsson53015342014-01-29 23:17:05 +0100466 static bool is_bad_option(const JavaVMOption* option, jboolean ignore, const char* option_type);
467
J. Duke81537792007-12-01 00:00:00 +0000468 static bool is_bad_option(const JavaVMOption* option, jboolean ignore) {
469 return is_bad_option(option, ignore, NULL);
470 }
Jesper Wilhelmsson53015342014-01-29 23:17:05 +0100471
J. Duke81537792007-12-01 00:00:00 +0000472 static void describe_range_error(ArgsRange errcode);
Swamy Venkataramanappa06e37c02008-12-15 13:58:57 -0800473 static ArgsRange check_memory_size(julong size, julong min_size);
474 static ArgsRange parse_memory_size(const char* s, julong* long_arg,
475 julong min_size);
Jon Masamitsuf2547452010-02-24 07:00:33 -0800476 // Parse a string for a unsigned integer. Returns true if value
477 // is an unsigned integer greater than or equal to the minimum
478 // parameter passed and returns the value in uintx_arg. Returns
479 // false otherwise, with uintx_arg undefined.
480 static bool parse_uintx(const char* value, uintx* uintx_arg,
481 uintx min_size);
J. Duke81537792007-12-01 00:00:00 +0000482
483 // methods to build strings from individual args
484 static void build_jvm_args(const char* arg);
485 static void build_jvm_flags(const char* arg);
486 static void add_string(char*** bldarray, int* count, const char* arg);
487 static const char* build_resource_string(char** args, int count);
488
489 static bool methodExists(
490 char* className, char* methodName,
491 int classesNum, char** classes, bool* allMethods,
492 int methodsNum, char** methods, bool* allClasses
493 );
494
495 static void parseOnlyLine(
496 const char* line,
497 short* classesNum, short* classesMax, char*** classes, bool** allMethods,
498 short* methodsNum, short* methodsMax, char*** methods, bool** allClasses
499 );
500
Derek White23813ce2015-09-11 15:31:03 -0400501 // Returns true if the flag is obsolete (and not yet expired).
502 // In this case the 'version' buffer is filled in with
503 // the version number when the flag became obsolete.
504 static bool is_obsolete_flag(const char* flag_name, JDK_Version* version);
505
506 // Returns 1 if the flag is deprecated (and not yet obsolete or expired).
507 // In this case the 'version' buffer is filled in with the version number when
508 // the flag became deprecated.
509 // Returns -1 if the flag is expired or obsolete.
510 // Returns 0 otherwise.
511 static int is_deprecated_flag(const char* flag_name, JDK_Version* version);
512
513 // Return the real name for the flag passed on the command line (either an alias name or "flag_name").
514 static const char* real_flag_name(const char *flag_name);
515
516 // Return the "real" name for option arg if arg is an alias, and print a warning if arg is deprecated.
517 // Return NULL if the arg has expired.
518 static const char* handle_aliases_and_deprecation(const char* arg, bool warn);
Rachel Protacioa74243c2015-12-11 14:58:20 -0500519 static bool lookup_logging_aliases(const char* arg, char* buffer);
Max Ockner45b28572016-01-13 14:56:17 -0500520 static AliasedLoggingFlag catch_logging_aliases(const char* name);
J. Duke81537792007-12-01 00:00:00 +0000521 static short CompileOnlyClassesNum;
522 static short CompileOnlyClassesMax;
523 static char** CompileOnlyClasses;
524 static bool* CompileOnlyAllMethods;
525
526 static short CompileOnlyMethodsNum;
527 static short CompileOnlyMethodsMax;
528 static char** CompileOnlyMethods;
529 static bool* CompileOnlyAllClasses;
530
531 static short InterpretOnlyClassesNum;
532 static short InterpretOnlyClassesMax;
533 static char** InterpretOnlyClasses;
534 static bool* InterpretOnlyAllMethods;
535
536 static bool CheckCompileOnly;
537
538 static char* SharedArchivePath;
539
540 public:
Zoltan Majoe559c172015-01-21 10:51:35 +0100541 // Scale compile thresholds
542 // Returns threshold scaled with CompileThresholdScaling
543 static intx scaled_compile_threshold(intx threshold, double scale);
544 static intx scaled_compile_threshold(intx threshold) {
545 return scaled_compile_threshold(threshold, CompileThresholdScaling);
546 }
547 // Returns freq_log scaled with CompileThresholdScaling
548 static intx scaled_freq_log(intx freq_log, double scale);
549 static intx scaled_freq_log(intx freq_log) {
550 return scaled_freq_log(freq_log, CompileThresholdScaling);
551 }
552
Thomas Schatzl962008f2013-09-11 16:25:02 +0200553 // Parses the arguments, first phase
J. Duke81537792007-12-01 00:00:00 +0000554 static jint parse(const JavaVMInitArgs* args);
Thomas Schatzl962008f2013-09-11 16:25:02 +0200555 // Apply ergonomics
556 static jint apply_ergo();
Erik Helin7e892702012-11-20 11:40:11 +0100557 // Adjusts the arguments after the OS have adjusted the arguments
558 static jint adjust_after_os();
Jesper Wilhelmsson53015342014-01-29 23:17:05 +0100559
Jesper Wilhelmsson1da0a962014-11-25 13:41:08 +0100560 static void set_gc_specific_flags();
John Coomes100e5852014-09-04 16:53:27 -0700561 static inline bool gc_selected(); // whether a gc has been selected
562 static void select_gc_ergonomically();
Jamsheed Mohammed C M36e011b2016-02-22 23:37:29 -0800563#if INCLUDE_JVMCI
564 // Check consistency of jvmci vm argument settings.
565 static bool check_jvmci_args_consistency();
566#endif
Jon Masamitsu63f1de52008-02-22 17:17:14 -0800567 // Check for consistency in the selection of the garbage collector.
Stefan Johansson9f7fa062015-03-02 11:08:09 +0100568 static bool check_gc_consistency(); // Check user-selected gc
Jesper Wilhelmsson81ba2e32014-01-23 14:47:23 +0100569 // Check consistency or otherwise of VM argument settings
J. Duke81537792007-12-01 00:00:00 +0000570 static bool check_vm_args_consistency();
571 // Used by os_solaris
572 static bool process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized);
573
Thomas Schatzl962008f2013-09-11 16:25:02 +0200574 static size_t conservative_max_heap_alignment() { return _conservative_max_heap_alignment; }
575 // Return the maximum size a heap with compressed oops can take
576 static size_t max_heap_for_compressed_oops();
577
J. Duke81537792007-12-01 00:00:00 +0000578 // return a char* array containing all options
579 static char** jvm_flags_array() { return _jvm_flags_array; }
580 static char** jvm_args_array() { return _jvm_args_array; }
581 static int num_jvm_flags() { return _num_jvm_flags; }
582 static int num_jvm_args() { return _num_jvm_args; }
583 // return the arguments passed to the Java application
584 static const char* java_command() { return _java_command; }
585
586 // print jvm_flags, jvm_args and java_command
587 static void print_on(outputStream* st);
Coleen Phillimore24c0f4e2015-07-22 00:03:45 -0400588 static void print_summary_on(outputStream* st);
J. Duke81537792007-12-01 00:00:00 +0000589
Ron Durbin409697a2015-11-11 14:57:27 -0800590 // convenient methods to get and set jvm_flags_file
591 static const char* get_jvm_flags_file() { return _jvm_flags_file; }
592 static void set_jvm_flags_file(const char *value) {
593 if (_jvm_flags_file != NULL) {
594 os::free(_jvm_flags_file);
595 }
596 _jvm_flags_file = os::strdup_check_oom(value);
597 }
J. Duke81537792007-12-01 00:00:00 +0000598 // convenient methods to obtain / print jvm_flags and jvm_args
599 static const char* jvm_flags() { return build_resource_string(_jvm_flags_array, _num_jvm_flags); }
600 static const char* jvm_args() { return build_resource_string(_jvm_args_array, _num_jvm_args); }
601 static void print_jvm_flags_on(outputStream* st);
602 static void print_jvm_args_on(outputStream* st);
603
604 // -Dkey=value flags
605 static SystemProperty* system_properties() { return _system_properties; }
606 static const char* get_property(const char* key);
607
608 // -Djava.vendor.url.bug
609 static const char* java_vendor_url_bug() { return _java_vendor_url_bug; }
610
611 // -Dsun.java.launcher
612 static const char* sun_java_launcher() { return _sun_java_launcher; }
613 // Was VM created by a Java launcher?
614 static bool created_by_java_launcher();
Ron Durbin97d55c82014-01-30 14:12:22 -0800615 // -Dsun.java.launcher.is_altjvm
616 static bool sun_java_launcher_is_altjvm();
J. Duke81537792007-12-01 00:00:00 +0000617 // -Dsun.java.launcher.pid
618 static int sun_java_launcher_pid() { return _sun_java_launcher_pid; }
619
Jiangli Zhoub454ece2013-07-03 17:26:59 -0400620 // -Xprof
J. Duke81537792007-12-01 00:00:00 +0000621 static bool has_profile() { return _has_profile; }
J. Duke81537792007-12-01 00:00:00 +0000622
Jesper Wilhelmsson81ba2e32014-01-23 14:47:23 +0100623 // -Xms
Jesper Wilhelmssonc1bc0a32015-03-03 18:01:27 +0100624 static size_t min_heap_size() { return _min_heap_size; }
625 static void set_min_heap_size(size_t v) { _min_heap_size = v; }
J. Duke81537792007-12-01 00:00:00 +0000626
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000627 // -Xbootclasspath/a
628 static int bootclassloader_append_index() {
629 return _bootclassloader_append_index;
630 }
631 static void set_bootclassloader_append_index(int value) {
632 _bootclassloader_append_index = value;
633 }
634
635 // -Xpatch
636 static char** patch_dirs() { return _patch_dirs; }
637 static int patch_dirs_count() { return _patch_dirs_count; }
638
J. Duke81537792007-12-01 00:00:00 +0000639 // -Xrun
640 static AgentLibrary* libraries() { return _libraryList.first(); }
641 static bool init_libraries_at_startup() { return !_libraryList.is_empty(); }
642 static void convert_library_to_agent(AgentLibrary* lib)
643 { _libraryList.remove(lib);
644 _agentList.add(lib); }
645
646 // -agentlib -agentpath
647 static AgentLibrary* agents() { return _agentList.first(); }
648 static bool init_agents_at_startup() { return !_agentList.is_empty(); }
649
650 // abort, exit, vfprintf hooks
651 static abort_hook_t abort_hook() { return _abort_hook; }
652 static exit_hook_t exit_hook() { return _exit_hook; }
653 static vfprintf_hook_t vfprintf_hook() { return _vfprintf_hook; }
654
655 static bool GetCheckCompileOnly () { return CheckCompileOnly; }
656
657 static const char* GetSharedArchivePath() { return SharedArchivePath; }
658
659 static bool CompileMethod(char* className, char* methodName) {
660 return
661 methodExists(
662 className, methodName,
663 CompileOnlyClassesNum, CompileOnlyClasses, CompileOnlyAllMethods,
664 CompileOnlyMethodsNum, CompileOnlyMethods, CompileOnlyAllClasses
665 );
666 }
667
668 // Java launcher properties
669 static void process_sun_java_launcher_properties(JavaVMInitArgs* args);
670
671 // System properties
672 static void init_system_properties();
673
Zhengyu Guafc56372010-09-30 12:05:08 -0400674 // Update/Initialize System properties after JDK version number is known
675 static void init_version_specific_system_properties();
676
Paul Hohensee4be7c3c2009-04-01 16:38:01 -0400677 // Property List manipulation
Goetz Lindenmaier1c18aef2015-01-05 12:07:37 -0500678 static void PropertyList_add(SystemProperty *element);
J. Duke81537792007-12-01 00:00:00 +0000679 static void PropertyList_add(SystemProperty** plist, SystemProperty *element);
Dmitry Dmitriev237449b2015-08-28 17:32:31 +0300680 static void PropertyList_add(SystemProperty** plist, const char* k, const char* v);
681 static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v) {
Paul Hohensee4be7c3c2009-04-01 16:38:01 -0400682 PropertyList_unique_add(plist, k, v, false);
683 }
Dmitry Dmitriev237449b2015-08-28 17:32:31 +0300684 static void PropertyList_unique_add(SystemProperty** plist, const char* k, const char* v, jboolean append);
J. Duke81537792007-12-01 00:00:00 +0000685 static const char* PropertyList_get_value(SystemProperty* plist, const char* key);
686 static int PropertyList_count(SystemProperty* pl);
687 static const char* PropertyList_get_key_at(SystemProperty* pl,int index);
688 static char* PropertyList_get_value_at(SystemProperty* pl,int index);
689
690 // Miscellaneous System property value getter and setters.
Dmitry Dmitriev237449b2015-08-28 17:32:31 +0300691 static void set_dll_dir(const char *value) { _sun_boot_library_path->set_value(value); }
692 static void set_java_home(const char *value) { _java_home->set_value(value); }
693 static void set_library_path(const char *value) { _java_library_path->set_value(value); }
Chris Hegarty393a39a2014-12-03 14:21:14 +0000694 static void set_ext_dirs(char *value) { _ext_dirs = os::strdup_check_oom(value); }
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000695
696 // Set up of the underlying system boot class path
697 static void set_jdkbootclasspath_append();
698 static void set_sysclasspath(const char *value) {
699 _system_boot_class_path->set_value(value);
700 set_jdkbootclasspath_append();
701 }
702 static void append_sysclasspath(const char *value) {
703 _system_boot_class_path->append_value(value);
704 set_jdkbootclasspath_append();
705 }
J. Duke81537792007-12-01 00:00:00 +0000706
Ioi Lambbe6f512014-08-12 17:29:00 -0700707 static char* get_java_home() { return _java_home->value(); }
708 static char* get_dll_dir() { return _sun_boot_library_path->value(); }
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000709 static char* get_sysclasspath() { return _system_boot_class_path->value(); }
Chris Hegarty393a39a2014-12-03 14:21:14 +0000710 static char* get_ext_dirs() { return _ext_dirs; }
Ioi Lambbe6f512014-08-12 17:29:00 -0700711 static char* get_appclasspath() { return _java_class_path->value(); }
712 static void fix_appclasspath();
J. Duke81537792007-12-01 00:00:00 +0000713
Chris Hegarty393a39a2014-12-03 14:21:14 +0000714
J. Duke81537792007-12-01 00:00:00 +0000715 // Operation modi
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000716 static Mode mode() { return _mode; }
Igor Veresov72754562014-09-10 19:08:17 -0700717 static bool is_interpreter_only() { return mode() == _int; }
718
J. Duke81537792007-12-01 00:00:00 +0000719
720 // Utility: copies src into buf, replacing "%%" with "%" and "%p" with pid.
721 static bool copy_expand_pid(const char* src, size_t srclen, char* buf, size_t buflen);
Alan Batemanf30fc1c2016-03-17 19:04:01 +0000722
723 static void check_unsupported_dumping_properties() NOT_CDS_RETURN;
J. Duke81537792007-12-01 00:00:00 +0000724};
Stefan Karlsson8006fe82010-11-23 13:22:55 -0800725
John Coomes100e5852014-09-04 16:53:27 -0700726bool Arguments::gc_selected() {
Bengt Rutisson0ecc7532014-11-27 21:02:13 +0100727 return UseConcMarkSweepGC || UseG1GC || UseParallelGC || UseParallelOldGC || UseSerialGC;
John Coomes100e5852014-09-04 16:53:27 -0700728}
John Coomes938374d2014-09-05 12:36:37 -0700729
Alexander Harlap3e2dcfd2015-02-04 13:14:27 -0500730// Disable options not supported in this release, with a warning if they
731// were explicitly requested on the command-line
732#define UNSUPPORTED_OPTION(opt, description) \
733do { \
734 if (opt) { \
735 if (FLAG_IS_CMDLINE(opt)) { \
736 warning(description " is disabled in this release."); \
737 } \
738 FLAG_SET_DEFAULT(opt, false); \
739 } \
740} while(0)
741
Stefan Karlsson8006fe82010-11-23 13:22:55 -0800742#endif // SHARE_VM_RUNTIME_ARGUMENTS_HPP