概要
Javaの起動オプション(以下、オプション)がOpenJDKのソースコード上でどのように扱われているか、どのように定義されているかについて説明します。
これによりソースコードをよむ手がかりをつかむことができます。
ここでのオプションは -XX: で始まる(-XX:+UseG1GC、-XX:MaxHeapSize= など)拡張オプションが対象です。
コースコードはOpenJDK11を対象としています。基本的なところはOpenJDK20でも変わっていません。
https://github.com/openjdk/jdk11/tree/master/src/hotspot 配下のものです。
C++言語で記述されています。
オプションのソースコード上での扱い
オプションはオプション名と同名のグローバル変数として定義されます。
例えば -XX:+UseG1GC なら変数名は UseG1GC など。
オプションは大きく分けて以下の2種類あります。
- "-" または "+" で指定され真偽値を持つもの(例 -XX:+UseG1GC)
- "=" の後に値を指定するもの(例 -XX:MaxHeapSize=)
真偽値をもつものは bool 型で定義され、値を持つものはその値によって int 型などで定義されます。
オプションの定義
主にソース share/runtime/globals.hpp (https://github.com/openjdk/jdk11/blob/master/src/hotspot/share/runtime/globals.hpp)
で定義されています。
他にオプションの内容によって
share/gc/shared/gc_globals.hpp (GC用)
share/c1/c1_globals.hpp (C1コンパイラ用)
などに分かれています。
オプションはマクロによって定義されています。
マクロには product、product_pd、develop、notproduct などがありますが、 product、product_pd 以外で定義されたオプションは製品版のjavaでは使えないオプションです。(例えばデバッグ用にビルドした場合に使えるなど)
product マクロの引数は以下の形式です。
引数 | 内容 |
---|---|
第1引数 | 変数の型 |
第2引数 | 変数名(オプション名) |
第3引数 | デフォルト値(※) |
第4引数 | 変数の説明 |
第5引数 | 値の取り得る範囲(省略可) |
(※)
デフォルト値はオプションによってはエルゴノミクス処理や他のオプションの影響で別の値に再設定される場合があります。
マクロの例
product(bool, UseG1GC, false, \
"Use the Garbage-First garbage collector") \
UseG1GCは bool 型でデフォルト値は false 。
product(double, MaxRAMPercentage, 25.0, \
"Maximum percentage of real memory used for maximum heap size") \
range(0.0, 100.0) \
MaxRAMPercentageは double 型でデフォルトは 25.0 、値の取り得る範囲は 0 ~ 100。
ソースコード上での使用例
オプションの値を判定に使う
if (SurvivorRatio < 1 || NewRatio < 1) {
vm_exit_during_initialization("Invalid young gen ratio specified");
}
オプションの値を計算に利用。
size_t survivor_size = size / InitialSurvivorRatio;
オプションの値を変数に代入。
if (NewSize > MaxNewSize) {
.....
_max_young_size = MaxNewSize;
}