< prev index next >
src/share/vm/runtime/arguments.cpp
Print this page
*** 117,127 ****
// Check if head of 'option' matches 'name', and sets 'tail' to the remaining
// part of the option string.
static bool match_option(const JavaVMOption *option, const char* name,
const char** tail) {
! int len = (int)strlen(name);
if (strncmp(option->optionString, name, len) == 0) {
*tail = option->optionString + len;
return true;
} else {
return false;
--- 117,127 ----
// Check if head of 'option' matches 'name', and sets 'tail' to the remaining
// part of the option string.
static bool match_option(const JavaVMOption *option, const char* name,
const char** tail) {
! size_t len = strlen(name);
if (strncmp(option->optionString, name, len) == 0) {
*tail = option->optionString + len;
return true;
} else {
return false;
*** 218,311 ****
// Update/Initialize System properties after JDK version number is known
void Arguments::init_version_specific_system_properties() {
enum { bufsz = 16 };
char buffer[bufsz];
! const char* spec_vendor = "Sun Microsystems Inc.";
! uint32_t spec_version = 0;
- spec_vendor = "Oracle Corporation";
- spec_version = JDK_Version::current().major_version();
jio_snprintf(buffer, bufsz, "1." UINT32_FORMAT, spec_version);
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.specification.vendor", spec_vendor, false));
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.specification.version", buffer, false));
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.vendor", VM_Version::vm_vendor(), false));
}
! /**
! * Provide a slightly more user-friendly way of eliminating -XX flags.
! * When a flag is eliminated, it can be added to this list in order to
! * continue accepting this flag on the command-line, while issuing a warning
! * and ignoring the value. Once the JDK version reaches the 'accept_until'
! * limit, we flatly refuse to admit the existence of the flag. This allows
! * a flag to die correctly over JDK releases using HSX.
! * But now that HSX is no longer supported only options with a future
! * accept_until value need to be listed, and the list can be pruned
! * on each major release.
*/
typedef struct {
const char* name;
! JDK_Version obsoleted_in; // when the flag went away
! JDK_Version accept_until; // which version to start denying the existence
! } ObsoleteFlag;
!
! static ObsoleteFlag obsolete_jvm_flags[] = {
! { "UseOldInlining", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "SafepointPollOffset", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseBoundThreads", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "DefaultThreadPriority", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NoYieldsInMicrolock", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "BackEdgeThreshold", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseNewReflection", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ReflectionWrapResolutionErrors",JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "VerifyReflectionBytecodes", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "AutoShutdownNMT", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NmethodSweepFraction", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NmethodSweepCheckInterval", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "CodeCacheMinimumFreeSpace", JDK_Version::jdk(9), JDK_Version::jdk(10) },
#ifndef ZERO
! { "UseFastAccessorMethods", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseFastEmptyMethods", JDK_Version::jdk(9), JDK_Version::jdk(10) },
#endif // ZERO
! { "UseCompilerSafepoints", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "AdaptiveSizePausePolicy", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ParallelGCRetainPLAB", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ThreadSafetyMargin", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "LazyBootClassLoader", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "StarvationMonitorInterval", JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "PreInflateSpin", JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ NULL, JDK_Version(0), JDK_Version(0) }
};
! // Returns true if the flag is obsolete and fits into the range specified
! // for being ignored. In the case that the flag is ignored, the 'version'
! // value is filled in with the version number when the flag became
! // obsolete so that that value can be displayed to the user.
! bool Arguments::is_newly_obsolete(const char *s, JDK_Version* version) {
! int i = 0;
assert(version != NULL, "Must provide a version buffer");
! while (obsolete_jvm_flags[i].name != NULL) {
! const ObsoleteFlag& flag_status = obsolete_jvm_flags[i];
! // <flag>=xxx form
! // [-|+]<flag> form
! size_t len = strlen(flag_status.name);
! if ((strncmp(flag_status.name, s, len) == 0) &&
! (strlen(s) == len)){
! if (JDK_Version::current().compare(flag_status.accept_until) == -1) {
! *version = flag_status.obsoleted_in;
return true;
}
}
- i++;
}
return false;
}
// Constructs the system class path (aka boot class path) from the following
// components, in order:
//
// prefix // from -Xbootclasspath/p:...
// base // from os::get_system_properties() or -Xbootclasspath=
--- 218,523 ----
// Update/Initialize System properties after JDK version number is known
void Arguments::init_version_specific_system_properties() {
enum { bufsz = 16 };
char buffer[bufsz];
! const char* spec_vendor = "Oracle Corporation";
! uint32_t spec_version = JDK_Version::current().major_version();
jio_snprintf(buffer, bufsz, "1." UINT32_FORMAT, spec_version);
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.specification.vendor", spec_vendor, false));
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.specification.version", buffer, false));
PropertyList_add(&_system_properties,
new SystemProperty("java.vm.vendor", VM_Version::vm_vendor(), false));
}
! /*
! * -XX argument processing:
! *
! * -XX arguments are defined in several places, such as:
! * globals.hpp, globals_<cpu>.hpp, globals_<os>.hpp, <compiler>_globals.hpp, or <gc>_globals.hpp.
! * -XX arguments are parsed in parse_argument().
! * -XX argument bounds checking is done in check_vm_args_consistency().
! *
! * Over time -XX arguments may change. There are mechanisms to handle common cases:
! *
! * ALIASED: An option that is simply another name for another option. This is often
! * part of the process of deprecating a flag, but not all aliases need
! * to be deprecated.
! *
! * Create an alias for an option by adding the old and new option names to the
! * "aliased_jvm_flags" table. Delete the old variable from globals.hpp (etc).
! *
! * DEPRECATED: An option that is supported, but a warning is printed to let the user know that
! * support may be removed in the future. Both regular and aliased options may be
! * deprecated.
! *
! * Add a deprecation warning for an option (or alias) by adding an entry in the
! * "special_jvm_flags" table and setting the "deprecated_in" field.
! * Often an option "deprecated" in one major release will
! * be made "obsolete" in the next. In this case the entry should also have it's
! * "obsolete_in" field set.
! *
! * OBSOLETE: An option that has been removed (and deleted from globals.hpp), but is still accepted
! * on the command line. A warning is printed to let the user know that option might not
! * be accepted in the future.
! *
! * Add an obsolete warning for an option by adding an entry in the "special_jvm_flags"
! * table and setting the "obsolete_in" field.
! *
! * EXPIRED: A deprecated or obsolete option that has an "accept_until" version less than or equal
! * to the current JDK version. The system will flatly refuse to admit the existence of
! * the flag. This allows a flag to die automatically over JDK releases.
! *
! * Note that manual cleanup of expired options should be done at major JDK version upgrades:
! * - Newly expired options should be removed from the special_jvm_flags and aliased_jvm_flags tables.
! * - Newly obsolete or expired deprecated options should have their global variable
! * definitions removed (from globals.hpp, etc) and related implementations removed.
! *
! * Recommended approach for removing options:
! *
! * To remove options commonly used by customers (e.g. product, commercial -XX options), use
! * the 3-step model adding major release numbers to the deprecate, obsolete and expire columns.
! *
! * To remove internal options (e.g. diagnostic, experimental, develop options), use
! * a 2-step model adding major release numbers to the obsolete and expire columns.
! *
! * To change the name of an option, use the alias table as well as a 2-step
! * model adding major release numbers to the deprecate and expire columns.
! * Think twice about aliasing commonly used customer options.
! *
! * There are times when it is appropriate to leave a future release number as undefined.
! *
! * Tests: Aliases should be tested in VMAliasOptions.java.
! * Deprecated options should be tested in VMDeprecatedOptions.java.
*/
+
+ // Obsolete or deprecated -XX flag.
typedef struct {
const char* name;
! JDK_Version deprecated_in; // When the deprecation warning started (or "undefined").
! JDK_Version obsolete_in; // When the obsolete warning started (or "undefined").
! JDK_Version expired_in; // When the option expires (or "undefined").
! } SpecialFlag;
!
! // The special_jvm_flags table declares options that are being deprecated and/or obsoleted. The
! // "deprecated_in" or "obsolete_in" fields may be set to "undefined", but not both.
! // When the JDK version reaches 'deprecated_in' limit, the JVM will process this flag on
! // the command-line as usual, but will issue a warning.
! // When the JDK version reaches 'obsolete_in' limit, the JVM will continue accepting this flag on
! // the command-line, while issuing a warning and ignoring the flag value.
! // Once the JDK version reaches 'expired_in' limit, the JVM will flatly refuse to admit the
! // existence of the flag.
! //
! // MANUAL CLEANUP ON JDK VERSION UPDATES:
! // This table ensures that the handling of options will update automatically when the JDK
! // version is incremented, but the source code needs to be cleanup up manually:
! // - As "deprecated" options age into "obsolete" or "expired" options, the associated "globals"
! // variable should be removed, as well as users of the variable.
! // - As "deprecated" options age into "obsolete" options, move the entry into the
! // "Obsolete Flags" section of the table.
! // - All expired options should be removed from the table.
! static SpecialFlag const special_jvm_flags[] = {
! #ifdef TEST_VERIFY_SPECIAL_JVM_FLAGS
! { "dep > obs", JDK_Version::jdk(9), JDK_Version::jdk(8), JDK_Version::undefined() },
! { "dep > exp ", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(8) },
! { "obs > exp ", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(8) },
! { "not deprecated or obsolete", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::undefined() },
! { "dup option", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() },
! { "dup option", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() },
! { "BytecodeVerificationRemote", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::undefined() },
! #endif
!
! // -------------- Deprecated Flags --------------
! // --- Non-alias flags - sorted by obsolete_in then expired_in:
! { "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() },
! { "UseParNewGC", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
!
! // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in:
! { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() },
! { "CreateMinidumpOnCrash", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() },
! { "CMSMarkStackSizeMax", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
! { "CMSMarkStackSize", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
! { "G1MarkStackSize", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
! { "ParallelMarkingThreads", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
! { "ParallelCMSThreads", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
!
! // -------------- Obsolete Flags - sorted by expired_in --------------
! { "UseOldInlining", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "SafepointPollOffset", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseBoundThreads", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "DefaultThreadPriority", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NoYieldsInMicrolock", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "BackEdgeThreshold", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseNewReflection", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ReflectionWrapResolutionErrors",JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "VerifyReflectionBytecodes", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "AutoShutdownNMT", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NmethodSweepFraction", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "NmethodSweepCheckInterval", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "CodeCacheMinimumFreeSpace", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
#ifndef ZERO
! { "UseFastAccessorMethods", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "UseFastEmptyMethods", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
#endif // ZERO
! { "UseCompilerSafepoints", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "AdaptiveSizePausePolicy", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ParallelGCRetainPLAB", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "ThreadSafetyMargin", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "LazyBootClassLoader", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "StarvationMonitorInterval", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
! { "PreInflateSpin", JDK_Version::undefined(), JDK_Version::jdk(9), JDK_Version::jdk(10) },
{ NULL, JDK_Version(0), JDK_Version(0) }
};
! // Flags that are aliases for other flags.
! typedef struct {
! const char* alias_name;
! const char* real_name;
! } AliasedFlag;
!
! static AliasedFlag const aliased_jvm_flags[] = {
! { "DefaultMaxRAMFraction", "MaxRAMFraction" },
! { "CMSMarkStackSizeMax", "MarkStackSizeMax" },
! { "CMSMarkStackSize", "MarkStackSize" },
! { "G1MarkStackSize", "MarkStackSize" },
! { "ParallelMarkingThreads", "ConcGCThreads" },
! { "ParallelCMSThreads", "ConcGCThreads" },
! { "CreateMinidumpOnCrash", "CreateCoredumpOnCrash" },
! { NULL, NULL}
! };
!
! // Return true if "v" is less than "other", where "other" may be "undefined".
! static bool version_less_than(JDK_Version v, JDK_Version other) {
! assert(!v.is_undefined(), "must be defined");
! if (!other.is_undefined() && v.compare(other) >= 0) {
! return false;
! } else {
! return true;
! }
! }
!
! static bool lookup_special_flag(const char *flag_name, SpecialFlag& flag) {
! for (size_t i = 0; special_jvm_flags[i].name != NULL; i++) {
! if ((strcmp(special_jvm_flags[i].name, flag_name) == 0)) {
! flag = special_jvm_flags[i];
! return true;
! }
! }
! return false;
! }
!
! bool Arguments::is_obsolete_flag(const char *flag_name, JDK_Version* version) {
assert(version != NULL, "Must provide a version buffer");
! SpecialFlag flag;
! if (lookup_special_flag(flag_name, flag)) {
! if (!flag.obsolete_in.is_undefined()) {
! if (version_less_than(JDK_Version::current(), flag.expired_in)) {
! *version = flag.obsolete_in;
return true;
}
}
}
return false;
}
+ int Arguments::is_deprecated_flag(const char *flag_name, JDK_Version* version) {
+ assert(version != NULL, "Must provide a version buffer");
+ SpecialFlag flag;
+ if (lookup_special_flag(flag_name, flag)) {
+ if (!flag.deprecated_in.is_undefined()) {
+ if (version_less_than(JDK_Version::current(), flag.obsolete_in) &&
+ version_less_than(JDK_Version::current(), flag.expired_in)) {
+ *version = flag.deprecated_in;
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+ }
+ return 0;
+ }
+
+ const char* Arguments::real_flag_name(const char *flag_name) {
+ for (size_t i = 0; aliased_jvm_flags[i].alias_name != NULL; i++) {
+ const AliasedFlag& flag_status = aliased_jvm_flags[i];
+ if (strcmp(flag_status.alias_name, flag_name) == 0) {
+ return flag_status.real_name;
+ }
+ }
+ return flag_name;
+ }
+
+ #ifndef PRODUCT
+ static bool lookup_special_flag(const char *flag_name, size_t skip_index) {
+ for (size_t i = 0; special_jvm_flags[i].name != NULL; i++) {
+ if ((i != skip_index) && (strcmp(special_jvm_flags[i].name, flag_name) == 0)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static bool verify_special_jvm_flags() {
+ bool success = true;
+ for (size_t i = 0; special_jvm_flags[i].name != NULL; i++) {
+ const SpecialFlag& flag = special_jvm_flags[i];
+ if (lookup_special_flag(flag.name, i)) {
+ warning("Duplicate special flag declaration \"%s\"", flag.name);
+ success = false;
+ }
+ if (flag.deprecated_in.is_undefined() &&
+ flag.obsolete_in.is_undefined()) {
+ warning("Special flag entry \"%s\" must declare version deprecated and/or obsoleted in.", flag.name);
+ success = false;
+ }
+
+ if (!flag.deprecated_in.is_undefined()) {
+ if (!version_less_than(flag.deprecated_in, flag.obsolete_in)) {
+ warning("Special flag entry \"%s\" must be deprecated before obsoleted.", flag.name);
+ success = false;
+ }
+
+ if (!version_less_than(flag.deprecated_in, flag.expired_in)) {
+ warning("Special flag entry \"%s\" must be deprecated before expired.", flag.name);
+ success = false;
+ }
+ }
+
+ if (!flag.obsolete_in.is_undefined()) {
+ if (!version_less_than(flag.obsolete_in, flag.expired_in)) {
+ warning("Special flag entry \"%s\" must be obsoleted before expired.", flag.name);
+ success = false;
+ }
+
+ // if flag has become obsolete it should not have a "globals" flag defined anymore.
+ if (!version_less_than(JDK_Version::current(), flag.obsolete_in)) {
+ if (Flag::find_flag(flag.name) != NULL) {
+ warning("Global variable for obsolete special flag entry \"%s\" should be removed", flag.name);
+ success = false;
+ }
+ }
+ }
+
+ if (!flag.expired_in.is_undefined()) {
+ // if flag has become expired it should not have a "globals" flag defined anymore.
+ if (!version_less_than(JDK_Version::current(), flag.expired_in)) {
+ if (Flag::find_flag(flag.name) != NULL) {
+ warning("Global variable for expired flag entry \"%s\" should be removed", flag.name);
+ success = false;
+ }
+ }
+ }
+
+ }
+ return success;
+ }
+ #endif
+
// Constructs the system class path (aka boot class path) from the following
// components, in order:
//
// prefix // from -Xbootclasspath/p:...
// base // from os::get_system_properties() or -Xbootclasspath=
*** 570,588 ****
default:
ShouldNotReachHere();
}
}
! static bool set_bool_flag(char* name, bool value, Flag::Flags origin) {
if (CommandLineFlags::boolAtPut(name, &value, origin) == Flag::SUCCESS) {
return true;
} else {
return false;
}
}
! static bool set_fp_numeric_flag(char* name, char* value, Flag::Flags origin) {
double v;
if (sscanf(value, "%lf", &v) != 1) {
return false;
}
--- 782,800 ----
default:
ShouldNotReachHere();
}
}
! static bool set_bool_flag(const char* name, bool value, Flag::Flags origin) {
if (CommandLineFlags::boolAtPut(name, &value, origin) == Flag::SUCCESS) {
return true;
} else {
return false;
}
}
! static bool set_fp_numeric_flag(const char* name, char* value, Flag::Flags origin) {
double v;
if (sscanf(value, "%lf", &v) != 1) {
return false;
}
*** 590,600 ****
return true;
}
return false;
}
! static bool set_numeric_flag(char* name, char* value, Flag::Flags origin) {
julong v;
int int_v;
intx intx_v;
bool is_neg = false;
// Check the sign first since atomull() parses only unsigned values.
--- 802,812 ----
return true;
}
return false;
}
! static bool set_numeric_flag(const char* name, char* value, Flag::Flags origin) {
julong v;
int int_v;
intx intx_v;
bool is_neg = false;
// Check the sign first since atomull() parses only unsigned values.
*** 639,656 ****
return true;
}
return false;
}
! static bool set_string_flag(char* name, const char* value, Flag::Flags origin) {
if (CommandLineFlags::ccstrAtPut(name, &value, origin) != Flag::SUCCESS) return false;
// Contract: CommandLineFlags always returns a pointer that needs freeing.
FREE_C_HEAP_ARRAY(char, value);
return true;
}
! static bool append_to_string_flag(char* name, const char* new_value, Flag::Flags origin) {
const char* old_value = "";
if (CommandLineFlags::ccstrAt(name, &old_value) != Flag::SUCCESS) return false;
size_t old_len = old_value != NULL ? strlen(old_value) : 0;
size_t new_len = strlen(new_value);
const char* value;
--- 851,868 ----
return true;
}
return false;
}
! static bool set_string_flag(const char* name, const char* value, Flag::Flags origin) {
if (CommandLineFlags::ccstrAtPut(name, &value, origin) != Flag::SUCCESS) return false;
// Contract: CommandLineFlags always returns a pointer that needs freeing.
FREE_C_HEAP_ARRAY(char, value);
return true;
}
! static bool append_to_string_flag(const char* name, const char* new_value, Flag::Flags origin) {
const char* old_value = "";
if (CommandLineFlags::ccstrAt(name, &old_value) != Flag::SUCCESS) return false;
size_t old_len = old_value != NULL ? strlen(old_value) : 0;
size_t new_len = strlen(new_value);
const char* value;
*** 674,738 ****
FREE_C_HEAP_ARRAY(char, free_this_too);
}
return true;
}
bool Arguments::parse_argument(const char* arg, Flag::Flags origin) {
// range of acceptable characters spelled out for portability reasons
#define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]"
#define BUFLEN 255
char name[BUFLEN+1];
char dummy;
if (sscanf(arg, "-%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
! return set_bool_flag(name, false, origin);
}
if (sscanf(arg, "+%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
! return set_bool_flag(name, true, origin);
}
char punct;
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "%c", name, &punct) == 2 && punct == '=') {
const char* value = strchr(arg, '=') + 1;
! Flag* flag = Flag::find_flag(name, strlen(name));
if (flag != NULL && flag->is_ccstr()) {
if (flag->ccstr_accumulates()) {
! return append_to_string_flag(name, value, origin);
} else {
if (value[0] == '\0') {
value = NULL;
}
! return set_string_flag(name, value, origin);
}
}
}
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE ":%c", name, &punct) == 2 && punct == '=') {
const char* value = strchr(arg, '=') + 1;
// -XX:Foo:=xxx will reset the string flag to the given value.
if (value[0] == '\0') {
value = NULL;
}
! return set_string_flag(name, value, origin);
}
#define SIGNED_FP_NUMBER_RANGE "[-0123456789.]"
#define SIGNED_NUMBER_RANGE "[-0123456789]"
#define NUMBER_RANGE "[0123456789]"
char value[BUFLEN + 1];
char value2[BUFLEN + 1];
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_NUMBER_RANGE "." "%" XSTR(BUFLEN) NUMBER_RANGE "%c", name, value, value2, &dummy) == 3) {
// Looks like a floating-point number -- try again with more lenient format string
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_FP_NUMBER_RANGE "%c", name, value, &dummy) == 2) {
! return set_fp_numeric_flag(name, value, origin);
}
}
#define VALUE_RANGE "[-kmgtxKMGTX0123456789abcdefABCDEF]"
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) VALUE_RANGE "%c", name, value, &dummy) == 2) {
! return set_numeric_flag(name, value, origin);
}
return false;
}
--- 886,1008 ----
FREE_C_HEAP_ARRAY(char, free_this_too);
}
return true;
}
+ const char* Arguments::handle_aliases_and_deprecation(const char* arg, bool warn) {
+ const char* real_name = real_flag_name(arg);
+ JDK_Version since = JDK_Version();
+ switch (is_deprecated_flag(arg, &since)) {
+ case -1:
+ return NULL; // obsolete or expired, don't process normally
+ case 0:
+ return real_name;
+ case 1: {
+ if (warn) {
+ char version[256];
+ since.to_string(version, sizeof(version));
+ if (real_name != arg) {
+ warning("Option %s was deprecated in version %s and will likely be removed in a future release. Use option %s instead.",
+ arg, version, real_name);
+ } else {
+ warning("Option %s was deprecated in version %s and will likely be removed in a future release.",
+ arg, version);
+ }
+ }
+ return real_name;
+ }
+ }
+ ShouldNotReachHere();
+ return NULL;
+ }
+
bool Arguments::parse_argument(const char* arg, Flag::Flags origin) {
// range of acceptable characters spelled out for portability reasons
#define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]"
#define BUFLEN 255
char name[BUFLEN+1];
char dummy;
+ const char* real_name;
+ bool warn_if_deprecated = true;
if (sscanf(arg, "-%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! return set_bool_flag(real_name, false, origin);
}
if (sscanf(arg, "+%" XSTR(BUFLEN) NAME_RANGE "%c", name, &dummy) == 1) {
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! return set_bool_flag(real_name, true, origin);
}
char punct;
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "%c", name, &punct) == 2 && punct == '=') {
const char* value = strchr(arg, '=') + 1;
! Flag* flag;
!
! // this scanf pattern matches both strings (handled here) and numbers (handled later))
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! flag = Flag::find_flag(real_name);
if (flag != NULL && flag->is_ccstr()) {
if (flag->ccstr_accumulates()) {
! return append_to_string_flag(real_name, value, origin);
} else {
if (value[0] == '\0') {
value = NULL;
}
! return set_string_flag(real_name, value, origin);
}
+ } else {
+ warn_if_deprecated = false; // if arg is deprecated, we've already done warning...
}
}
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE ":%c", name, &punct) == 2 && punct == '=') {
const char* value = strchr(arg, '=') + 1;
// -XX:Foo:=xxx will reset the string flag to the given value.
if (value[0] == '\0') {
value = NULL;
}
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! return set_string_flag(real_name, value, origin);
}
#define SIGNED_FP_NUMBER_RANGE "[-0123456789.]"
#define SIGNED_NUMBER_RANGE "[-0123456789]"
#define NUMBER_RANGE "[0123456789]"
char value[BUFLEN + 1];
char value2[BUFLEN + 1];
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_NUMBER_RANGE "." "%" XSTR(BUFLEN) NUMBER_RANGE "%c", name, value, value2, &dummy) == 3) {
// Looks like a floating-point number -- try again with more lenient format string
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) SIGNED_FP_NUMBER_RANGE "%c", name, value, &dummy) == 2) {
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! return set_fp_numeric_flag(real_name, value, origin);
}
}
#define VALUE_RANGE "[-kmgtxKMGTX0123456789abcdefABCDEF]"
if (sscanf(arg, "%" XSTR(BUFLEN) NAME_RANGE "=" "%" XSTR(BUFLEN) VALUE_RANGE "%c", name, value, &dummy) == 2) {
! real_name = handle_aliases_and_deprecation(name, warn_if_deprecated);
! if (real_name == NULL) {
! return false;
! }
! return set_numeric_flag(real_name, value, origin);
}
return false;
}
*** 836,847 ****
}
}
}
bool Arguments::process_argument(const char* arg,
! jboolean ignore_unrecognized, Flag::Flags origin) {
!
JDK_Version since = JDK_Version();
if (parse_argument(arg, origin) || ignore_unrecognized) {
return true;
}
--- 1106,1117 ----
}
}
}
bool Arguments::process_argument(const char* arg,
! jboolean ignore_unrecognized,
! Flag::Flags origin) {
JDK_Version since = JDK_Version();
if (parse_argument(arg, origin) || ignore_unrecognized) {
return true;
}
*** 863,876 ****
// Construct a string which consists only of the argument name without '+', '-', or '='.
char stripped_argname[BUFLEN+1];
strncpy(stripped_argname, argname, arg_len);
stripped_argname[arg_len] = '\0'; // strncpy may not null terminate.
! if (is_newly_obsolete(stripped_argname, &since)) {
char version[256];
since.to_string(version, sizeof(version));
! warning("ignoring option %s; support was removed in %s", stripped_argname, version);
return true;
}
}
// For locked flags, report a custom error message if available.
--- 1133,1146 ----
// Construct a string which consists only of the argument name without '+', '-', or '='.
char stripped_argname[BUFLEN+1];
strncpy(stripped_argname, argname, arg_len);
stripped_argname[arg_len] = '\0'; // strncpy may not null terminate.
! if (is_obsolete_flag(stripped_argname, &since)) {
char version[256];
since.to_string(version, sizeof(version));
! warning("Ignoring option %s; support was removed in %s", stripped_argname, version);
return true;
}
}
// For locked flags, report a custom error message if available.
*** 1226,1236 ****
#if INCLUDE_ALL_GCS
static void disable_adaptive_size_policy(const char* collector_name) {
if (UseAdaptiveSizePolicy) {
if (FLAG_IS_CMDLINE(UseAdaptiveSizePolicy)) {
! warning("disabling UseAdaptiveSizePolicy; it is incompatible with %s.",
collector_name);
}
FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
}
}
--- 1496,1506 ----
#if INCLUDE_ALL_GCS
static void disable_adaptive_size_policy(const char* collector_name) {
if (UseAdaptiveSizePolicy) {
if (FLAG_IS_CMDLINE(UseAdaptiveSizePolicy)) {
! warning("Disabling UseAdaptiveSizePolicy; it is incompatible with %s.",
collector_name);
}
FLAG_SET_DEFAULT(UseAdaptiveSizePolicy, false);
}
}
*** 1701,1711 ****
} else if (UseConcMarkSweepGC) {
set_cms_and_parnew_gc_flags();
} else if (UseG1GC) {
set_g1_gc_flags();
}
- check_deprecated_gc_flags();
if (AssumeMP && !UseSerialGC) {
if (FLAG_IS_DEFAULT(ParallelGCThreads) && ParallelGCThreads == 1) {
warning("If the number of processors is expected to increase from one, then"
" you should configure the number of parallel GC threads appropriately"
" using -XX:ParallelGCThreads=N");
--- 1971,1980 ----
*** 1731,1745 ****
// Use static initialization to get the default before parsing
static const size_t DefaultHeapBaseMinAddress = HeapBaseMinAddress;
void Arguments::set_heap_size() {
- if (!FLAG_IS_DEFAULT(DefaultMaxRAMFraction)) {
- // Deprecated flag
- FLAG_SET_CMDLINE(uintx, MaxRAMFraction, DefaultMaxRAMFraction);
- }
-
const julong phys_mem =
FLAG_IS_DEFAULT(MaxRAM) ? MIN2(os::physical_memory(), (julong)MaxRAM)
: (julong)MaxRAM;
// If the maximum heap size has not been set with -Xmx,
--- 2000,2009 ----
*** 1838,1848 ****
}
}
}
}
! // Set up runtime image flags
void Arguments::set_runtime_image_flags() {
#ifdef _LP64
// Memory map image file by default on 64 bit machines.
if (FLAG_IS_DEFAULT(MemoryMapImage)) {
FLAG_SET_ERGO(bool, MemoryMapImage, true);
--- 2102,2228 ----
}
}
}
}
! // This option inspects the machine and attempts to set various
! // parameters to be optimal for long-running, memory allocation
! // intensive jobs. It is intended for machines with large
! // amounts of cpu and memory.
! jint Arguments::set_aggressive_heap_flags() {
! // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit
! // VM, but we may not be able to represent the total physical memory
! // available (like having 8gb of memory on a box but using a 32bit VM).
! // Thus, we need to make sure we're using a julong for intermediate
! // calculations.
! julong initHeapSize;
! julong total_memory = os::physical_memory();
!
! if (total_memory < (julong) 256 * M) {
! jio_fprintf(defaultStream::error_stream(),
! "You need at least 256mb of memory to use -XX:+AggressiveHeap\n");
! vm_exit(1);
! }
!
! // The heap size is half of available memory, or (at most)
! // all of possible memory less 160mb (leaving room for the OS
! // when using ISM). This is the maximum; because adaptive sizing
! // is turned on below, the actual space used may be smaller.
!
! initHeapSize = MIN2(total_memory / (julong) 2,
! total_memory - (julong) 160 * M);
!
! initHeapSize = limit_by_allocatable_memory(initHeapSize);
!
! if (FLAG_IS_DEFAULT(MaxHeapSize)) {
! if (FLAG_SET_CMDLINE(size_t, MaxHeapSize, initHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, InitialHeapSize, initHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! // Currently the minimum size and the initial heap sizes are the same.
! set_min_heap_size(initHeapSize);
! }
! if (FLAG_IS_DEFAULT(NewSize)) {
! // Make the young generation 3/8ths of the total heap.
! if (FLAG_SET_CMDLINE(size_t, NewSize,
! ((julong) MaxHeapSize / (julong) 8) * (julong) 3) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, MaxNewSize, NewSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! }
!
! #if !defined(_ALLBSD_SOURCE) && !defined(AIX) // UseLargePages is not yet supported on BSD and AIX.
! FLAG_SET_DEFAULT(UseLargePages, true);
! #endif
!
! // Increase some data structure sizes for efficiency
! if (FLAG_SET_CMDLINE(size_t, BaseFootPrintEstimate, MaxHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(bool, ResizeTLAB, false) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, TLABSize, 256 * K) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // See the OldPLABSize comment below, but replace 'after promotion'
! // with 'after copying'. YoungPLABSize is the size of the survivor
! // space per-gc-thread buffers. The default is 4kw.
! if (FLAG_SET_CMDLINE(size_t, YoungPLABSize, 256 * K) != Flag::SUCCESS) { // Note: this is in words
! return JNI_EINVAL;
! }
!
! // OldPLABSize is the size of the buffers in the old gen that
! // UseParallelGC uses to promote live data that doesn't fit in the
! // survivor spaces. At any given time, there's one for each gc thread.
! // The default size is 1kw. These buffers are rarely used, since the
! // survivor spaces are usually big enough. For specjbb, however, there
! // are occasions when there's lots of live data in the young gen
! // and we end up promoting some of it. We don't have a definite
! // explanation for why bumping OldPLABSize helps, but the theory
! // is that a bigger PLAB results in retaining something like the
! // original allocation order after promotion, which improves mutator
! // locality. A minor effect may be that larger PLABs reduce the
! // number of PLAB allocation events during gc. The value of 8kw
! // was arrived at by experimenting with specjbb.
! if (FLAG_SET_CMDLINE(size_t, OldPLABSize, 8 * K) != Flag::SUCCESS) { // Note: this is in words
! return JNI_EINVAL;
! }
!
! // Enable parallel GC and adaptive generation sizing
! if (FLAG_SET_CMDLINE(bool, UseParallelGC, true) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! FLAG_SET_DEFAULT(ParallelGCThreads,
! Abstract_VM_Version::parallel_worker_threads());
!
! // Encourage steady state memory management
! if (FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // This appears to improve mutator locality
! if (FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // Get around early Solaris scheduling bug
! // (affinity vs other jobs on system)
! // but disallow DR and offlining (5008695).
! if (FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! return JNI_OK;
! }
!
! // Set up runtime image flags
void Arguments::set_runtime_image_flags() {
#ifdef _LP64
// Memory map image file by default on 64 bit machines.
if (FLAG_IS_DEFAULT(MemoryMapImage)) {
FLAG_SET_ERGO(bool, MemoryMapImage, true);
*** 2027,2050 ****
}
return true;
}
- void Arguments::check_deprecated_gc_flags() {
- if (FLAG_IS_CMDLINE(UseParNewGC)) {
- warning("The UseParNewGC flag is deprecated and will likely be removed in a future release");
- }
- if (FLAG_IS_CMDLINE(MaxGCMinorPauseMillis)) {
- warning("Using MaxGCMinorPauseMillis as minor pause goal is deprecated"
- "and will likely be removed in future release");
- }
- if (FLAG_IS_CMDLINE(DefaultMaxRAMFraction)) {
- warning("DefaultMaxRAMFraction is deprecated and will likely be removed in a future release. "
- "Use MaxRAMFraction instead.");
- }
- }
-
// Check the consistency of vm_init_args
bool Arguments::check_vm_args_consistency() {
// Method for adding checks for flag consistency.
// The intent is to warn the user of all possible conflicts,
// before returning an error.
--- 2407,2416 ----
*** 2576,2586 ****
match_option(option, "-Xoptimize") ||
match_option(option, "-Xboundthreads")) {
// All these options are deprecated in JDK 9 and will be removed in a future release
char version[256];
JDK_Version::jdk(9).to_string(version, sizeof(version));
! warning("ignoring option %s; support was removed in %s", option->optionString, version);
} else if (match_option(option, "-XX:CodeCacheExpansionSize=", &tail)) {
julong long_CodeCacheExpansionSize = 0;
ArgsRange errcode = parse_memory_size(tail, &long_CodeCacheExpansionSize, os::vm_page_size());
if (errcode != arg_in_range) {
jio_fprintf(defaultStream::error_stream(),
--- 2942,2952 ----
match_option(option, "-Xoptimize") ||
match_option(option, "-Xboundthreads")) {
// All these options are deprecated in JDK 9 and will be removed in a future release
char version[256];
JDK_Version::jdk(9).to_string(version, sizeof(version));
! warning("Ignoring option %s; support was removed in %s", option->optionString, version);
} else if (match_option(option, "-XX:CodeCacheExpansionSize=", &tail)) {
julong long_CodeCacheExpansionSize = 0;
ArgsRange errcode = parse_memory_size(tail, &long_CodeCacheExpansionSize, os::vm_page_size());
if (errcode != arg_in_range) {
jio_fprintf(defaultStream::error_stream(),
*** 2843,2966 ****
_exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo);
} else if (match_option(option, "abort")) {
_abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo);
// -XX:+AggressiveHeap
} else if (match_option(option, "-XX:+AggressiveHeap")) {
!
! // This option inspects the machine and attempts to set various
! // parameters to be optimal for long-running, memory allocation
! // intensive jobs. It is intended for machines with large
! // amounts of cpu and memory.
!
! // initHeapSize is needed since _initial_heap_size is 4 bytes on a 32 bit
! // VM, but we may not be able to represent the total physical memory
! // available (like having 8gb of memory on a box but using a 32bit VM).
! // Thus, we need to make sure we're using a julong for intermediate
! // calculations.
! julong initHeapSize;
! julong total_memory = os::physical_memory();
!
! if (total_memory < (julong)256*M) {
! jio_fprintf(defaultStream::error_stream(),
! "You need at least 256mb of memory to use -XX:+AggressiveHeap\n");
! vm_exit(1);
! }
!
! // The heap size is half of available memory, or (at most)
! // all of possible memory less 160mb (leaving room for the OS
! // when using ISM). This is the maximum; because adaptive sizing
! // is turned on below, the actual space used may be smaller.
!
! initHeapSize = MIN2(total_memory / (julong)2,
! total_memory - (julong)160*M);
!
! initHeapSize = limit_by_allocatable_memory(initHeapSize);
!
! if (FLAG_IS_DEFAULT(MaxHeapSize)) {
! if (FLAG_SET_CMDLINE(size_t, MaxHeapSize, initHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, InitialHeapSize, initHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! // Currently the minimum size and the initial heap sizes are the same.
! set_min_heap_size(initHeapSize);
! }
! if (FLAG_IS_DEFAULT(NewSize)) {
! // Make the young generation 3/8ths of the total heap.
! if (FLAG_SET_CMDLINE(size_t, NewSize,
! ((julong)MaxHeapSize / (julong)8) * (julong)3) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, MaxNewSize, NewSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! }
!
! #if !defined(_ALLBSD_SOURCE) && !defined(AIX) // UseLargePages is not yet supported on BSD and AIX.
! FLAG_SET_DEFAULT(UseLargePages, true);
! #endif
!
! // Increase some data structure sizes for efficiency
! if (FLAG_SET_CMDLINE(size_t, BaseFootPrintEstimate, MaxHeapSize) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(bool, ResizeTLAB, false) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! if (FLAG_SET_CMDLINE(size_t, TLABSize, 256*K) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // See the OldPLABSize comment below, but replace 'after promotion'
! // with 'after copying'. YoungPLABSize is the size of the survivor
! // space per-gc-thread buffers. The default is 4kw.
! if (FLAG_SET_CMDLINE(size_t, YoungPLABSize, 256*K) != Flag::SUCCESS) { // Note: this is in words
! return JNI_EINVAL;
! }
!
! // OldPLABSize is the size of the buffers in the old gen that
! // UseParallelGC uses to promote live data that doesn't fit in the
! // survivor spaces. At any given time, there's one for each gc thread.
! // The default size is 1kw. These buffers are rarely used, since the
! // survivor spaces are usually big enough. For specjbb, however, there
! // are occasions when there's lots of live data in the young gen
! // and we end up promoting some of it. We don't have a definite
! // explanation for why bumping OldPLABSize helps, but the theory
! // is that a bigger PLAB results in retaining something like the
! // original allocation order after promotion, which improves mutator
! // locality. A minor effect may be that larger PLABs reduce the
! // number of PLAB allocation events during gc. The value of 8kw
! // was arrived at by experimenting with specjbb.
! if (FLAG_SET_CMDLINE(size_t, OldPLABSize, 8*K) != Flag::SUCCESS) { // Note: this is in words
! return JNI_EINVAL;
! }
!
! // Enable parallel GC and adaptive generation sizing
! if (FLAG_SET_CMDLINE(bool, UseParallelGC, true) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
! FLAG_SET_DEFAULT(ParallelGCThreads,
! Abstract_VM_Version::parallel_worker_threads());
!
! // Encourage steady state memory management
! if (FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // This appears to improve mutator locality
! if (FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false) != Flag::SUCCESS) {
! return JNI_EINVAL;
! }
!
! // Get around early Solaris scheduling bug
! // (affinity vs other jobs on system)
! // but disallow DR and offlining (5008695).
! if (FLAG_SET_CMDLINE(bool, BindGCTaskThreadsToCPUs, true) != Flag::SUCCESS) {
! return JNI_EINVAL;
}
-
// Need to keep consistency of MaxTenuringThreshold and AlwaysTenure/NeverTenure;
// and the last option wins.
} else if (match_option(option, "-XX:+NeverTenure")) {
if (FLAG_SET_CMDLINE(bool, NeverTenure, true) != Flag::SUCCESS) {
return JNI_EINVAL;
--- 3209,3222 ----
_exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo);
} else if (match_option(option, "abort")) {
_abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo);
// -XX:+AggressiveHeap
} else if (match_option(option, "-XX:+AggressiveHeap")) {
! jint result = set_aggressive_heap_flags();
! if (result != JNI_OK) {
! return result;
}
// Need to keep consistency of MaxTenuringThreshold and AlwaysTenure/NeverTenure;
// and the last option wins.
} else if (match_option(option, "-XX:+NeverTenure")) {
if (FLAG_SET_CMDLINE(bool, NeverTenure, true) != Flag::SUCCESS) {
return JNI_EINVAL;
*** 3049,3104 ****
// disable scavenge before parallel mark-compact
if (FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false) != Flag::SUCCESS) {
return JNI_EINVAL;
}
#endif
- } else if (match_option(option, "-XX:CMSMarkStackSize=", &tail) ||
- match_option(option, "-XX:G1MarkStackSize=", &tail)) {
- julong stack_size = 0;
- ArgsRange errcode = parse_memory_size(tail, &stack_size, 1);
- if (errcode != arg_in_range) {
- jio_fprintf(defaultStream::error_stream(),
- "Invalid mark stack size: %s\n", option->optionString);
- describe_range_error(errcode);
- return JNI_EINVAL;
- }
- jio_fprintf(defaultStream::error_stream(),
- "Please use -XX:MarkStackSize in place of "
- "-XX:CMSMarkStackSize or -XX:G1MarkStackSize in the future\n");
- if (FLAG_SET_CMDLINE(size_t, MarkStackSize, stack_size) != Flag::SUCCESS) {
- return JNI_EINVAL;
- }
- } else if (match_option(option, "-XX:CMSMarkStackSizeMax=", &tail)) {
- julong max_stack_size = 0;
- ArgsRange errcode = parse_memory_size(tail, &max_stack_size, 1);
- if (errcode != arg_in_range) {
- jio_fprintf(defaultStream::error_stream(),
- "Invalid maximum mark stack size: %s\n",
- option->optionString);
- describe_range_error(errcode);
- return JNI_EINVAL;
- }
- jio_fprintf(defaultStream::error_stream(),
- "Please use -XX:MarkStackSizeMax in place of "
- "-XX:CMSMarkStackSizeMax in the future\n");
- if (FLAG_SET_CMDLINE(size_t, MarkStackSizeMax, max_stack_size) != Flag::SUCCESS) {
- return JNI_EINVAL;
- }
- } else if (match_option(option, "-XX:ParallelMarkingThreads=", &tail) ||
- match_option(option, "-XX:ParallelCMSThreads=", &tail)) {
- uintx conc_threads = 0;
- if (!parse_uintx(tail, &conc_threads, 1)) {
- jio_fprintf(defaultStream::error_stream(),
- "Invalid concurrent threads: %s\n", option->optionString);
- return JNI_EINVAL;
- }
- jio_fprintf(defaultStream::error_stream(),
- "Please use -XX:ConcGCThreads in place of "
- "-XX:ParallelMarkingThreads or -XX:ParallelCMSThreads in the future\n");
- if (FLAG_SET_CMDLINE(uint, ConcGCThreads, conc_threads) != Flag::SUCCESS) {
- return JNI_EINVAL;
- }
} else if (match_option(option, "-XX:MaxDirectMemorySize=", &tail)) {
julong max_direct_memory_size = 0;
ArgsRange errcode = parse_memory_size(tail, &max_direct_memory_size, 0);
if (errcode != arg_in_range) {
jio_fprintf(defaultStream::error_stream(),
--- 3305,3314 ----
*** 3114,3136 ****
} else if (match_option(option, "-XX:+ManagementServer")) {
jio_fprintf(defaultStream::error_stream(),
"ManagementServer is not supported in this VM.\n");
return JNI_ERR;
#endif // INCLUDE_MANAGEMENT
- // CreateMinidumpOnCrash is removed, and replaced by CreateCoredumpOnCrash
- } else if (match_option(option, "-XX:+CreateMinidumpOnCrash")) {
- if (FLAG_SET_CMDLINE(bool, CreateCoredumpOnCrash, true) != Flag::SUCCESS) {
- return JNI_EINVAL;
- }
- jio_fprintf(defaultStream::output_stream(),
- "CreateMinidumpOnCrash is replaced by CreateCoredumpOnCrash: CreateCoredumpOnCrash is on\n");
- } else if (match_option(option, "-XX:-CreateMinidumpOnCrash")) {
- if (FLAG_SET_CMDLINE(bool, CreateCoredumpOnCrash, false) != Flag::SUCCESS) {
- return JNI_EINVAL;
- }
- jio_fprintf(defaultStream::output_stream(),
- "CreateMinidumpOnCrash is replaced by CreateCoredumpOnCrash: CreateCoredumpOnCrash is off\n");
} else if (match_option(option, "-XX:", &tail)) { // -XX:xxxx
// Skip -XX:Flags= since that case has already been handled
if (strncmp(tail, "Flags=", strlen("Flags=")) != 0) {
if (!process_argument(tail, args->ignoreUnrecognized, origin)) {
return JNI_EINVAL;
--- 3324,3333 ----
*** 3505,3515 ****
}
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
if (RequireSharedSpaces) {
! warning("cannot dump shared archive while using shared archive");
}
UseSharedSpaces = false;
#ifdef _LP64
if (!UseCompressedOops || !UseCompressedClassPointers) {
vm_exit_during_initialization(
--- 3702,3712 ----
}
void Arguments::set_shared_spaces_flags() {
if (DumpSharedSpaces) {
if (RequireSharedSpaces) {
! warning("Cannot dump shared archive while using shared archive");
}
UseSharedSpaces = false;
#ifdef _LP64
if (!UseCompressedOops || !UseCompressedClassPointers) {
vm_exit_during_initialization(
*** 3663,3672 ****
--- 3860,3870 ----
}
// Parse entry point called from JNI_CreateJavaVM
jint Arguments::parse(const JavaVMInitArgs* args) {
+ assert(verify_special_jvm_flags(), "deprecated and obsolete flag table inconsistent");
// Initialize ranges and constraints
CommandLineFlagRangeList::init();
CommandLineFlagConstraintList::init();
*** 3784,3794 ****
}
#endif // PRODUCT
if (ScavengeRootsInCode == 0) {
if (!FLAG_IS_DEFAULT(ScavengeRootsInCode)) {
! warning("forcing ScavengeRootsInCode non-zero");
}
ScavengeRootsInCode = 1;
}
if (PrintGCDetails) {
--- 3982,3992 ----
}
#endif // PRODUCT
if (ScavengeRootsInCode == 0) {
if (!FLAG_IS_DEFAULT(ScavengeRootsInCode)) {
! warning("Forcing ScavengeRootsInCode non-zero");
}
ScavengeRootsInCode = 1;
}
if (PrintGCDetails) {
< prev index next >