IgnoreUnrecognizedVMOptions and badly specified options
Gerard Ziemski
gerard.ziemski at oracle.com
Thu Jun 25 17:19:08 UTC 2015
I will be happy to take a look.
cheers
On 6/25/2015 12:09 PM, Daniel D. Daugherty wrote:
> I'm pretty sure that bug was filed this morning:
>
> JDK-8129855 -XX:+IgnoreUnrecognizedVMOptions hides improperly
> specified VM options.
> https://bugs.openjdk.java.net/browse/JDK-8129855
>
> Michail was reading your mind...
>
> Dan
>
>
> On 6/25/15 11:06 AM, Vladimir Kozlov wrote:
>> File bug on runtime (who handles flags verification this days?) with
>> your suggestion.
>>
>> Thanks,
>> Vladimir
>>
>> On 6/25/15 10:00 AM, 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