Blocks :
|
|
Relates :
|
|
Relates :
|
After fixing JDK-8060449 Java 9 consider deprecated integer options as invalid. For example, if we run Java 8 with "-XX:MaxPermSize=384m", then we got message that "ignoring option MaxPermSize=384m; support was removed in 8.0" But if we ran Java 9 with deprecated in JDK9 integer option, e.g. with "-XX:NmethodSweepFraction=10", then Java reports an error and exit: "Unrecognized VM option 'NmethodSweepFraction=10'". The problem in modified if statement in "Arguments::is_newly_obsolete" method in "src/share/vm/runtime/arguments.cpp": 333 bool Arguments::is_newly_obsolete(const char *s, JDK_Version* version) { ... 341 if (((strncmp(flag_status.name, s, len) == 0) && 342 (strlen(s) == len)) || 343 ((s[0] == '+' || s[0] == '-') && 344 (strncmp(flag_status.name, &s[1], len) == 0) && 345 (strlen(&s[1]) == len))) { Now function check that passed argument have the exactly the same length as defined in obsolete_jvm_flags, so "MaxPermSize=384m" and "MaxPermSize" are different. Special case should be added for integer options. Also, JDK-8060449 fix add call of "is_newly_obsolete" function for fuzzy matched option in Arguments::process_arguments function: jio_fprintf(defaultStream::error_stream(), "Unrecognized VM option '%s'\n", argname); Flag* fuzzy_matched = Flag::fuzzy_match((const char*)argname, arg_len, true); if (fuzzy_matched != NULL) { jio_fprintf(defaultStream::error_stream(), "Did you mean '%s%s%s'? ", (fuzzy_matched->is_bool()) ? "(+/-)" : "", fuzzy_matched->_name, (fuzzy_matched->is_bool()) ? "" : "=<value>"); if (is_newly_obsolete(fuzzy_matched->_name, &since)) { char version[256]; since.to_string(version, sizeof(version)); jio_fprintf(defaultStream::error_stream(), "Warning: support for %s was removed in %s\n", fuzzy_matched->_name, version); } But in this case it senseless, because fuzzy_match take flags from flag table, i.e. from non-deprecated flags and is_newly_obsolete get flags from obsolete_jvm_flags table. In normal conditions the option can not exist in two tables at the same time. So, is_newly_obsolete will always return false in this case. But if added "if (is_newly_obsolete)" will be deleted, then "test/runtime/CommandLine/ObsoleteFlagErrorMessage.java" test should be corrected. The following line should be deleted from test: output.shouldContain("support").shouldContain("removed"); // Should warn user that the option they are trying to use is no longer supported. The interesting thing, that now test passed, because test use "-XX:UseBoundThreads" option which incorrectly exists in obsolete_jvm_flags and in normal flag table. And in this case "fuzzy_match" found this option in flag table. But this is incorrect situation and soon "-XX:UseBoundThreads" will be deleted from set of existing flags.