JDK-8073989 : Deprecated integer options are considered as invalid instead of deprecated in Java 9
  • Type: Bug
  • Component: hotspot
  • Sub-Component: runtime
  • Affected Version: 9
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2015-02-26
  • Updated: 2015-06-30
  • Resolved: 2015-04-16
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 9
9 b64Fixed
Related Reports
Blocks :  
Relates :  
Relates :  
Description
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.