IgnoreUnrecognizedVMOptions and badly specified options

Dmitry Dmitriev dmitry.dmitriev at oracle.com
Thu Jun 25 17:00:07 UTC 2015


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