JDK-8265517 : Change definition of LargePageSizeInBytes
  • Type: CSR
  • Component: hotspot
  • Sub-Component: gc
  • Priority: P4
  • Status: Closed
  • Resolution: Approved
  • Fix Versions: 17
  • Submitted: 2021-04-20
  • Updated: 2021-04-28
  • Resolved: 2021-04-28
Related Reports
CSR :  
Description
Summary
-------

Change the meaning of `LargePageSizeInBytes` to be the maximum large page size the JVM may use (not the only one). A default value of zero will mean to allow the JVM use large page sizes up to the environment's default large page size.

Problem
-------

Currently the JVM only uses a single large page size for large memory allocations. This may either be the environment's default large page size if `LargePageSizeInBytes` is zero, or the value specified in `LargePageSizeInBytes`.

If multiple large page sizes are configured there is no possibility to leverage all of the available large page sizes. This can lead to sub-optimal use of memory as large pages may need to be pre-allocated in the environment and reduced performance because not all page sizes are suitable for all memory allocations in the JVM.

The Java man page already defines `LargePageSizeInBytes` as the maximum size the JVM may use: 

----------


`-XX:LargePageSizeInBytes=`*size*
:   Sets the maximum size (in bytes) for large pages used for the Java heap.
    The *size* argument must be a power of 2 (2, 4, 8, 16, and so on). Append
    the letter `k` or `K` to indicate kilobytes, `m` or `M` to indicate
    megabytes, or `g` or `G` to indicate gigabytes. By default, the size is
    set to 0, meaning that the JVM chooses the size for large pages
    automatically. See [Large Pages].

    The following example describes how to set the large page size to 4
    megabytes (MB):

    >   `-XX:LargePageSizeInBytes=4m`


----------

The implementation did not exploit this specification until now.

Solution
--------

The value of `LargePageSizeInBytes` will always define the maximum large page size the JVM may use out of the ones configured in the environment. If the user does not specify `LargePageSizeInBytes` on the command line or sets it to zero, the JVM will use the default large page size for the environment for the maximum large page size.

Specification
-------------

Changes made to the HotSpot code to update the flag:

    diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
    index cfe5fd8116c..2d09075fb48 100644
    --- a/src/hotspot/share/runtime/globals.hpp
    +++ b/src/hotspot/share/runtime/globals.hpp
    @@ -239,7 +239,8 @@ const intx ObjectAlignmentInBytes = 8;
               "Use intrinsics for java.util.Base64")                            \
                                                                                 \
       product(size_t, LargePageSizeInBytes, 0,                                  \
    -          "Large page size (0 to let VM choose the page size)")             \
    +          "Maximum large page size used (0 will use the default large "     \
    +          "page size for the environment as the maximum)")                  \
               range(0, max_uintx)                                               \
                                                                                 \
       product(size_t, LargePageHeapSizeThreshold, 128*M,                        \


Changes are also required for the Java man pages, here is a proposal:


----------
`-XX:LargePageSizeInBytes=`*size*
:   Sets the maximum large page size (in bytes) to use by the JVM. The
    *size* argument must be a valid large page size supported by the
    environment to have any effect. Append the letter `k` or `K` to indicate
    kilobytes, `m` or `M` to indicate megabytes, or `g` or `G` to
    indicate gigabytes.
    By default, the value of this option is set to 0, meaning that the JVM
    will use the default large page size for the environment as the maximum large page size.
    See [Large Pages].

    The following example describes how to set the large page size to 1
    gigabyte (GB):

    >   `-XX:LargePageSizeInBytes=1g`


----------

Comments
Approving for JDK 17. If you want to backport this change to other releases, either file a separate CSR for the backport or withdraw, update, and re-Finalize this request for additional fixVersions.
28-04-2021

Looks good to me.
21-04-2021