Java11のHeapメモリサイズを指定しようとしたらいつの間にか%で指定できるようになっていた。

以下のオプションが関連してくるようだが、使用するのは InitialRAMPercentageMaxRAMPercentage MinRAMPercentageが最小割当サイズと勘違いしたが、200MB未満でしか使用されないプロパティだった。

  • InitialRAMPercentage

  • MaxRAMPercentage

  • MinRAMPercentage

  • MaxRAM

  • MaxRAMFraction

16GBの物理マシンで実行
C:\Users\szk>java -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XshowSettings:vm -XX:+PrintFlagsFinal --version | grep -Ei "maxheapsize | maxram"
   size_t MaxHeapSize                              = 11920211968                               {product} {ergonomic}
 uint64_t MaxRAM                                   = 137438953472                           {pd product} {default}
    uintx MaxRAMFraction                           = 4                                         {product} {default}
   double MaxRAMPercentage                         = 70.000000                                 {product} {command line}
   size_t ShenandoahSoftMaxHeapSize                = 0                                      {manageable} {default}
VM settings:
    Max. Heap Size (Estimated): 11.10G
    Using VM: OpenJDK 64-Bit Server VM

コンテナのメモリ制限にも対応しているようだ。

C:\Users\szk>docker run -m 1GB amazoncorretto:11 java -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XshowSettings:vm -XX:+PrintFlagsFinal --version | grep -Ei "maxheapsize | maxram"
   size_t MaxHeapSize                              = 752877568                                 {product} {ergonomic}
 uint64_t MaxRAM                                   = 137438953472                           {pd product} {default}
    uintx MaxRAMFraction                           = 4                                         {product} {default}
   double MaxRAMPercentage                         = 70.000000                                 {product} {command line}
   size_t ShenandoahSoftMaxHeapSize                = 0                                      {manageable} {default}
VM settings:
    Max. Heap Size (Estimated): 694.12M
    Using VM: OpenJDK 64-Bit Server VM