Any reason why +PrintFlagsFinal requires unlocking experimental and diagnostic flags to print their default values?

David Holmes david.holmes at oracle.com
Mon Dec 1 09:21:04 UTC 2025


Okay I have filed:

JDK-8372802: PrintFlagsFinal should also print locked flags

but note there is no commitment for anyone to actually perform the work.

David

On 28/11/2025 3:19 pm, Thomas Stüfe wrote:
> I am very much in favor of printing all flags, for the reasons Frederic 
> has given. When one supports many different releases, it is a huge 
> timesaver not to have to look up flags but see them right there in the 
> customer logs. The ability of PrintFlagsFinal to give me all flags, 
> including default values, after they are resolved to their final values, 
> is also very useful during development.
> 
> For simplicity, I would prefer just to change the behavior of 
> PrintFlagsFinal to do that, but I could live with a new PrintAllFlagsFinal.
> 
> Number of normal flags: 513, incl. diagnostic: 777, incl. 
> experimental&diagnostic: 933. (Jdk 25). So, it's a bit more. I am not 
> bothered by this, since this list never fits onto a single screen 
> anyway. People grep. But if others prefer an extra flag, sure, 
> let's have one.
> 
> 
> On Thu, Nov 27, 2025 at 3:05 AM David Holmes <david.holmes at oracle.com 
> <mailto:david.holmes at oracle.com>> wrote:
> 
>     On 27/11/2025 12:53 am, Frederic Thevenet wrote:
>      > Hi,
>      >
>      > Currently, using +PrintFlagsFinal prints out all JVM flags and their
>      > values, even if they were not modified from their default, except
>     for
>      > 'locked' flags, i.e. Experimental and Diagnotic flags. In order
>     to have
>      > those printed out as well, one must first 'unlock' them (with
>      > +UnlockExperimentalVMOptions, for instance).
> 
>     I think this was simply a pragmatic decision to avoid overwhelming the
>     user with information that should not be relevant.
>      > Now, is their a strong reason for not always displaying the default
>      > values for those in scenarios were there is no concerns that the
>     output
>      > might be too large (that is when calling upon
>     'JVMFlag::printFlags' with
>      > 'skipDefaults' set to false, like PrintFlagsFinal does)?
>      >
>      > The reason for this question is that when chasing a bug in scenarios
>      > where one can only rely on logs or output provided by tools that
>     uses
>      > +PrintFlagsFinal, getting the default values *in the conditions that
>      > those logs where produced* can be tricky as it depends on the exact
>      > version of the JDK that was running, and some values can be
>     changed by
>      > ergonomics.
> 
>     Ouch. I think that would be a poor design choice for diagnostic, and
>     especially experimental flags!
> 
> 
> Not every experimental/diagnostic flag is a boolean that defaults to 
> false and controls an opt-in feature. We have non-boolean experimental 
> flags and boolean flags that default to true. It is not unthinkable that 
> those are changed during VM start.
> 
> 
>      > If you need to know the default for experimental flags -- which
>     given
>      > their nature can and do change often -- your choices are to
>     either ask
>      > for these logs to be generated again using
>     +UnlockExperimentalVMOptions
>      > (even if there is no intention of changing an experimental flag)
>     or to
>      > go on a time consuming deep dive into the code base for the exact
>      > version of the JDK that was used. Neither is ideal.
> 
>     True, but for experimental flags in particular, unless you are deep
>     diving into the code how can you know whether a particular flag and its
>     value are relevant to your debugging in the first place?
> 
> 
> I think the point here is reducing analyst strain. It's not that it is 
> impossible to get the information otherwise, but that it's convenient 
> and stress-reducing to have one sure way to look up all resolved 
> flag values for a customer's JVM run. Folks who have to work with many 
> cases involving different JVM versions would value this.
> 
> BTW, we do print default values for non-experimental non-diagnostic 
> flags, too. The same reasoning applies here: if its not changed, you 
> could look up the default value.
> 
> 
>     That said, I don't see any harm in providing a way to print all flags,
>     though whether by default or by a new -XX:PrintAllFlagsFinal flag, I'm
>     not sure.
> 
> 
> Wonderful, let's do that then.
> 
> Cheers, Thomas



More information about the hotspot-dev mailing list