IgnoreUnrecognizedVMOptions and badly specified options

Dmitry Dmitriev dmitry.dmitriev at oracle.com
Thu Jun 25 17:04:34 UTC 2015


Sorry about bad code paste(and repeate my thoughts after code):

  817 bool Arguments::process_argument(const char* arg,
  818     jboolean ignore_unrecognized, Flag::Flags origin) {
  819
  820   JDK_Version since = JDK_Version();
  821
  822   if (parse_argument(arg, origin) || ignore_unrecognized) {
  823     return true;
  824   }
...
  850   // For locked flags, report a custom error message if available.
  851   // Otherwise, report the standard unrecognized VM option.
  852   Flag* found_flag = Flag::find_flag((const char*)argname, 
arg_len, true, true);
  853   if (found_flag != NULL) {
  854     char locked_message_buf[BUFLEN];
  855     found_flag->get_locked_message(locked_message_buf, BUFLEN);
  856     if (strlen(locked_message_buf) == 0) {
  857       if (found_flag->is_bool() && !has_plus_minus) {
  858         jio_fprintf(defaultStream::error_stream(),
  859           "Missing +/- setting for VM option '%s'\n", argname);
  860       } else if (!found_flag->is_bool() && has_plus_minus) {
  861         jio_fprintf(defaultStream::error_stream(),
  862           "Unexpected +/- setting in VM option '%s'\n", argname);
  863       } else {
  864         jio_fprintf(defaultStream::error_stream(),
  865           "Improperly specified VM option '%s'\n", argname);
  866       }
  867     } else {
  868       jio_fprintf(defaultStream::error_stream(), "%s", 
locked_message_buf);
  869     }
  870   } else {
  871     jio_fprintf(defaultStream::error_stream(),
  872                 "Unrecognized VM option '%s'\n", argname);
  873     Flag* fuzzy_matched = Flag::fuzzy_match((const char*)argname, 
arg_len, true);
  874     if (fuzzy_matched != NULL) {
  875       jio_fprintf(defaultStream::error_stream(),
  876                   "Did you mean '%s%s%s'? ",
  877                   (fuzzy_matched->is_bool()) ? "(+/-)" : "",
  878                   fuzzy_matched->_name,
  879                   (fuzzy_matched->is_bool()) ? "" : "=<value>");
  880     }
  881   }
  882
  883   // allow for commandline "commenting out" options like -XX:#+Verbose
  884   return arg[0] == '#';
  885 }

If "-XX:+IgnoreUnrecongnizedVMOptions" is specified, then 
"ignore_unrecognized" will be true and "if" statement on line 822 will 
always be true.
I just think that a better place to check "ignore_unrecognized" is on 
"else" branch on line 867(for locked flags) and on "else" branch on line 
870(where we actually found unrecognized option). If 
"ignore_unrecognized" is true, then return true in this case, otherwise 
execute code in these "else" branches. It's my thoughts about that. In 
this case improperly specified options will be catched(lines 857-866).

Thanks,
Dmitry

On 25.06.2015 20:00, Dmitry Dmitriev wrote:
> Hello Vladimir,
>
> Thank you for explanation. I just was bit confused about valid VM 
> options but which improperly specified.
> I look at the Arguments::process_argument function in 
> src/share/vm/runtime/arguments.cpp module and noticed one thing:
>
> 817 bool Arguments::process_argument(const char* arg, 818 jboolean 
> ignore_unrecognized, Flag::Flags origin) { 819 820 JDK_Version since = 
> JDK_Version(); 821 822 if (parse_argument(arg, origin) || 
> ignore_unrecognized) { 823 return true; 824 } ... 850 // For locked 
> flags, report a custom error message if available. 851 // Otherwise, 
> report the standard unrecognized VM option. 852 Flag* found_flag = 
> Flag::find_flag((const char*)argname, arg_len, true, true); 853 if 
> (found_flag != NULL) { 854 char locked_message_buf[BUFLEN]; 855 
> found_flag->get_locked_message(locked_message_buf, BUFLEN); 856 if 
> (strlen(locked_message_buf) == 0) { 857 if (found_flag->is_bool() && 
> !has_plus_minus) { 858 jio_fprintf(defaultStream::error_stream(), 859 
> "Missing +/- setting for VM option '%s'\n", argname); 860 } else if 
> (!found_flag->is_bool() && has_plus_minus) { 861 
> jio_fprintf(defaultStream::error_stream(), 862 "Unexpected +/- setting 
> in VM option '%s'\n", argname); 863 } else { 864 
> jio_fprintf(defaultStream::error_stream(), 865 "Improperly specified 
> VM option '%s'\n", argname); 866 } 867 } else { 868 
> jio_fprintf(defaultStream::error_stream(), "%s", locked_message_buf); 
> 869 } 870 } else { 871 jio_fprintf(defaultStream::error_stream(), 872 
> "Unrecognized VM option '%s'\n", argname); 873 Flag* fuzzy_matched = 
> Flag::fuzzy_match((const char*)argname, arg_len, true); 874 if 
> (fuzzy_matched != NULL) { 875 
> jio_fprintf(defaultStream::error_stream(), 876 "Did you mean '%s%s%s'? 
> ", 877 (fuzzy_matched->is_bool()) ? "(+/-)" : "", 878 
> fuzzy_matched->_name, 879 (fuzzy_matched->is_bool()) ? "" : 
> "=<value>"); 880 } 881 } 882 883 // allow for commandline "commenting 
> out" options like -XX:#+Verbose 884 return arg[0] == '#'; 885 }
>
> If "-XX:+IgnoreUnrecongnizedVMOptions" is specified, then 
> "ignore_unrecognized" will be true and "if" statement on line 822 will 
> always be true.
> I just think that a better place to check "ignore_unrecognized" is on 
> "else" branch on line 867(for locked flags) and on "else" branch on 
> line 870(where we actually found unrecognized option). If 
> "ignore_unrecognized" is true, then return true in this case, 
> otherwise execute code in these "else" branches. It's my thoughts 
> about that. In this case improperly specified options will be 
> catched(lines 857-866).
>
> Thanks,
> Dmitry
>
>
> On 25.06.2015 17:45, Vladimir Kozlov wrote:
>> It is not intentional but difficult to implement.
>> It was added to allow specify options which are not defined in 
>> running VM.
>> For example when C2 option is specified but Client VM (which has only 
>> C1) is run.
>> We can do more smarter things here, I agree, by trying to verify 
>> options before ignoring it.
>> But it will not help with misspelled options, I think.
>>
>> Regards,
>> Vladimir
>>
>> On 6/25/15 5:17 AM, Dmitry Dmitriev wrote:
>>> Hello,
>>>
>>> Working with JVM command line options I noticed that 
>>> "IgnoreUnrecognizedVMOptions" option allow to hide options with bad
>>> values. "IgnoreUnrecognizedVMOptions" allow to ignore unrecognized 
>>> options, but it also allow to ignore improperly
>>> specified VM Options which are processed in general way, i.e. "-XX:" 
>>> options processed by Arguments::process_argument
>>> function(hotspot/src/share/vm/runtime/arguments.cpp module).
>>>
>>> I will be very appreciated if someone can describe this behavior or 
>>> state that this is intentional.
>>>
>>> Example for numeric and boolean options:
>>> 1) Bad numeric option with and without 
>>> "-XX:+IgnoreUnrecongnizedVMOptions"
>>> java -XX:MaxRAMFraction=-1 -version
>>> Improperly specified VM option 'MaxRAMFraction=-1'
>>> Error: Could not create the Java Virtual Machine.
>>> Error: A fatal exception has occurred. Program will exit.
>>>
>>> java -XX:MaxRAMFraction=-1 -XX:+IgnoreUnrecognizedVMOptions -version
>>> java version "1.8.0_40"
>>> Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
>>> Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
>>>
>>> 2) Bad boolean option with and without 
>>> "-XX:+IgnoreUnrecongnizedVMOptions"
>>> java -XX:UseG1GC -version
>>> Missing +/- setting for VM option 'UseG1GC'
>>> Error: Could not create the Java Virtual Machine.
>>> Error: A fatal exception has occurred. Program will exit.
>>>
>>> java -XX:UseG1GC -XX:+IgnoreUnrecognizedVMOptions -version
>>> java version "1.8.0_40"
>>> Java(TM) SE Runtime Environment (build 1.8.0_40-b26)
>>> Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)
>>>
>>> So, as we see when "-XX:+IgnoreUnrecongnizedVMOptions" is used, bad 
>>> "-XX:MaxRAMFraction=-1" and "-XX:UseG1GC" are
>>> ignored. I don't know is this behavior intentional or not, but 
>>> HotSpot works in that way.
>>>
>>> So, can someone tell me this is intentional? Or this behavior is wrong?
>>>
>>> Thank you,
>>> Dmitry
>>>
>>>
>



More information about the hotspot-dev mailing list