JVMの設定について

  •  
 
おじさん2024年1月17日 - 18:30 に投稿

概要:


この記事はJVMの設定項目について調べたことをまとめたものです。
設定項目のうち、主にメモリ関連の設定を紹介します。
また、一部の設定を変更し、その確認をおこないます。

環境情報:


  • Java バージョン17.0.6
  • OS:Mac(Apple M1) 13.4

目次:


  • JVMの設定について
  • 設定を変更してみる
  • KeycloakのJVMの設定方法
  • まとめ

JVMの設定について:


JVM(Java Virtual Machine)はJavaのプログラムを実行するソフトウェアです。
この設定を変更することで、プログラムが使用するメモリサイズ等を指定することができます。
設定の変更は、javaコマンドにオプションを指定することでおこなえます。

Javaのオプションについて:


Javaのオプションには以下の種類があります。
- 標準オプション
- 追加オプション
- 拡張オプション

標準オプション:


全てのJVMでサポートされているオプションです。
例えば以下のようなものがあります。

  • --class-path パス
    クラスパスを指定するオプションです。
    引数にパスを指定します。

  • --show-version
    Javaのバージョンを表示してするオプションです。
    処理はそのまま続きます。

  • -verbose:class
    ロードされるクラスの情報を表示するオプションです。

追加オプション:


すべてのJVMでサポートされている保証がないオプションです。
-Xで始まります。
例えば以下のようなものがあります。

  • -Xms サイズ
    最小ヒープサイズを指定するオプションです。
    引数には以下のようにサイズを指定します。
    kやmを引数の後ろにつけることで、キロバイト、メガバイト単位の指定ができます。
  • -Xms 16777216
  • -Xms 16384k
  • -Xms 16m

  • -Xmx サイズ
    最大ヒープサイズを指定するオプションです。
    引数には以下のようにサイズを指定します。

  • -Xmx 33554432
  • -Xmx 32768k
  • -Xmx 32m

  • -XshowSettings
    JVMやホスト、ロケール等の設定を表示するオプションです。
    処理はそのまま続行します。

拡張オプション:


こちらもすべてのJVMでサポートされている保証がないオプションです。
-XXで始まります。
例えば以下のようなものがあります。

  • -XX:MaxHeapSize=サイズ
    最大ヒープサイズを指定するオプションです。
    追加オプションの -Xmx と同じです。

  • -XX:NewSize=サイズ
    New領域のサイズを設定するオプションです。
    引数にサイズを指定します。

  • -XX:MaxNewSize=サイズ
    New領域のサイズの最大サイズを設定するオプションです。
    引数にサイズを指定します。

  • -XX:SurvivorRatio=比率
    New領域のうち、Eden領域とSurvivor領域のサイズ比率を設定します。
    デフォルトは8に設定されています。

  • -XX:+PrintFlagsFinal
    JVMの設定値の一覧を表示するオプションです。
    無効にする場合-XX:-PrintFlagsFinalを指定します。

設定方法について:


javaコマンドの引数にオプションを指定することで、JVMの設定を変更してプログラムを実行できます。
以下のように指定します。

java オプション プログラム名  

設定を変更してみる:


実際にオプションを指定して動作を確認してみます。
JVMの設定の中で、メモリに関する以下のオプションを指定して結果を確認します。

変更を試すオプション:


  • -Xms
  • -Xmx
  • -XX:NewSize
  • -XX:MaxNewSize

プログラムの作成:


プログラムを作成します。
今回使用したjavaのプログラムは以下になります。
ループを繰り返すのみのプログラムになります。
- Loop.java

public class Loop {
    public static void main(String[] args){
        System.out.println("実行中...");
        while(true){
        }
    }
}
  1. ターミナルを開き、好きなディレクトに移動します。
  2. Loop.javaファイルを作成します。
    vi Loop.java

  3. 以下のコマンドでコンパイルします。

    javac Loop.java

プログラムの実行:


プログラムがコンパイルできたらプログラムを実行し、設定が変更されるかを確認します。
変更した設定は、-XX:+PrintFlagsFinalオプションをつけることで確認できます。

  1. 最初に-XX:+PrintFlagsFinalオプションのみを指定して実行してみます。
java -XX:+PrintFlagsFinal Loop
  1. 実行結果を確認します。
    画像のように設定の一覧が表示されます。
    設定の一覧の中から、以下の値を確認しておきます。

    • size_t MinHeapSize = 8388608
    • size_t MaxHeapSize = 4294967296
    • size_t MaxNewSize = 2575302656
    • size_t NewSize = 1363144
  2. 次に以下のオプションを設定して実行します。

  • -Xms
  • -Xmx
  • -XX:NewSize
  • -XX:MaxNewSize

  • オプションを追加して実行します。

java -XX:+PrintFlagsFinal \
-Xms16m \
-Xmx32m \
-XX:NewSize=128 \
-XX:MaxNewSize=16m \
Loop
  1. 実行を確認します。
    実行した結果、以下の値が設定されているか確認します。
    • size_t MinHeapSize = 16777216
    • size_t MaxHeapSize = 33554432
    • size_t MaxNewSize = 16777216
    • size_t NewSize = 128

KeycloakのJVMの設定方法:


Keycloakでは、JAVA_OPT環境変数でオプションを指定することができます。
-Xmxを1024メガバイトにする場合は以下のように指定します。

export JAVA_OPTS="$JAVA_OPTS -Xmx1024m"

実行すると画像のようになります。

まとめ:


今回はJVMの設定項目について紹介しました。
設定項目は今回紹介した以外にも多くあるため、
今後調べてみようと思います。

参考にしたところ:


コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。
画像
1
2