RFR(L) 8243208 Clean up JVMFlag implementation

Ioi Lam ioi.lam at oracle.com
Wed Sep 2 01:29:27 UTC 2020


https://bugs.openjdk.java.net/browse/JDK-8243208
http://cr.openjdk.java.net/~iklam/jdk16/8243208-cleanup-jvmflag-impl.v01/
https://wiki.openjdk.java.net/display/HotSpot/Hotspot+Command-line+Flags+Clean+Up+-+Design+Proposal+for+JDK-8243208



Please review this major clean up of HotSpot command-line flags. The 
goals are:

     + Reduce the complexity of the implementation
     + Improvement footprint/performance (with C++ constexpr)
     + Allow more flexibility in flag declaration (see also JDK-7123237)



**** Notable interface changes:

     I tried to make the changes non-intrusive. Most HotSpot developers
     should not be affected at all, unless you touch the following areas:

[1] The declaration of diagnostic/experimental/manageable flags is changed.
     See globals.hpp for examples:

     OLD: experimental(intx, hashCode, 5, "..docs...")
     NEW: product(intx, hashCode, 5, EXPERIMENTAL, "..docs...")

     The reason is to support more flexible combinations. Before,
     all experimental flags must be "product". Now they can be "develop"
     as well.

[2] Declaration of constraint functions is changed to use a macro.
     See jvmFlagConstraintsRuntime.hpp

[3] The confusing type JVMFlag::Flags is renamed to JVMFlag::Attrs to be
     clear it's about "attributes of the flags" and not "the flags
     themselves".

[4] The min/max of all ranges must be compile-time constants. We had
     two cases where the min/max was specified via os::xxx function
     calls. These are converted to constraint functions:

     OLD:
     product_pd(uintx, InitialCodeCacheSize, "...") \
             range(os::vm_page_size(), max_uintx)

     product(size_t, NUMAInterleaveGranularity, 2*M, "...")  \
             range(os::vm_allocation_granularity(), \
                   NOT_LP64(2*G) LP64_ONLY(8192*G)) \

     NEW:
     product_pd(uintx, InitialCodeCacheSize, "...") \
             constraint(VMPageSizeConstraintFunc, AtParse)

     product(size_t, NUMAInterleaveGranularity, 2*M, "...")  \
              constraint(NUMAInterleaveGranularityConstraintFunc, \
                         AtParse)



**** Notable implementation changes:

[1] C++ constexpr is used extensively for build-time initialization of
     various tables.

[2] All XXX_FLAGS() macros now consistent take 7 arguments. Application
     of these macros in jvmFlag.cpp have been greatly simplified.

     This also makes it possible for further modularization in the future
     (see JDK-8243205).

     example:

     #define RUNTIME_FLAGS(develop, \
                           develop_pd, \
                           product, \
                           product_pd, \
                           notproduct, \
                           range, \
                           constraint) \

[3] When processing the command-line arguments, the JVM flags are now
     searched using a build-time generated hashtable. See jvmFlagLookup.cpp

[4] Tables for range/constraint check used to be dynamically constructed
     and linearly searched. Now they are build-time generated, with O(1)
     access time (a simple array index).

For detailed discussion on the new design, please see
https://wiki.openjdk.java.net/display/HotSpot/Hotspot+Command-line+Flags+Clean+Up+-+Design+Proposal+for+JDK-8243208



**** Next steps

     I tried to keep this changeset small. So some changes are deferred:

[1] In an separate RFE (JDK-8081833) I will use C++ templates
     to consolidate the large amount of duplicated code in jvmFlag.cpp,
     jvmFlagRangeList.cpp and jvmFlagConstraintList.cpp.

[2] There are archaic test cases that assume that experimental flags
     must be product flags. See JVMFlag::JVMFlag() constructor in 
jvmFlag.cpp.
     I'll relax this in JDK-7123237 and update the test cases.


Thanks
- Ioi


More information about the hotspot-dev mailing list