最も重要なJVMパラメータのガイド

最も重要なJVMパラメーターのガイド

1. 概要

このクイックチュートリアルでは、Java仮想マシンの構成に使用できる最もよく知られたオプションについて説明します。

2. 明示的なヒープメモリ–XmsおよびXmxオプション

最も一般的なパフォーマンス関連のプラクティスの1つは、アプリケーションの要件に従ってヒープメモリを初期化することです。

そのため、最小および最大のヒープサイズを指定する必要があります。 以下のパラメーターを使用してそれを達成できます。

-Xms[unit]
-Xmx[unit]

ここで、unitは、メモリ(heap sizeで示される)が初期化される単位を示します。 単位は、GBの場合は‘g'、MBの場合は‘m'、KBの場合は‘k'としてマークできます。

たとえば、最小2 GBと最大5 GBをJVMに割り当てる場合、次のように記述する必要があります。

-Xms2G -Xmx5G

Java 8以降、Metaspaceのサイズは定義されていません。 グローバル制限に達すると、JVMは自動的にそれを増やしますが、不必要な不安定性を克服するために、次のようにMetaspaceサイズを設定できます。

-XX:MaxMetaspaceSize=[unit]

ここで、metaspace sizeは、Metaspaceに割り当てるメモリの量を示します。

Oracle guidelinesによると、使用可能なメモリの合計に続いて、2番目に影響力のある要因は、若い世代用に予約されているヒープの割合です。 デフォルトでは、YGの最小サイズは1310MBで、最大サイズはunlimitedです。

それらを明示的に割り当てることができます:

-XX:NewSize=[unit]
-XX:MaxNewSize=[unit]

3. ガベージコレクション

アプリケーションの安定性を高めるには、正しいGarbage Collectionアルゴリズムを選択することが重要です。

JVMには、次の4種類のGC実装があります。

  • シリアルガベージコレクター

  • 並列ガベージコレクター

  • CMSガベージコレクター

  • G1ガベージコレクター

これらの実装は、以下のパラメーターで宣言できます。

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

Garbage Collectionの実装の詳細については、hereを参照してください。

4. GCロギング

アプリケーションの状態を厳密に監視するには、JVMのGarbage Collectionのパフォーマンスを常にチェックする必要があります。 これを行う最も簡単な方法は、GCアクティビティを人間が読める形式でログに記録することです。

次のパラメータを使用して、GCアクティビティをログに記録できます。

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotationは、log4j、s4ljなどと同様に、ログファイルのローリングポリシーを指定します。 NumberOfGCLogFilesは、単一のアプリケーションライフサイクルで書き込むことができるログファイルの最大数を示します。 GCLogFileSizeは、ファイルの最大サイズを指定します。 最後に、loggcはその場所を示します。

ここで注意すべき点は、GCログに日付ごとのタイムスタンプを出力するために使用できるJVMパラメーターがさらに2つ(-XX:+PrintGCTimeStamps-XX:+PrintGCDateStamps)あることです。

たとえば、最大100GCのログファイルを割り当て、それぞれの最大サイズが50 MBで、それらを ‘/home/user/log/'の場所に保存する場合は、次の構文を使用できます。

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

ただし、問題は、バックグラウンドでシステム時間を監視するために常に1つの追加のデーモンスレッドが使用されることです。 この動作により、パフォーマンスのボトルネックが発生する可能性があります。そのため、本番環境ではこのパラメータを使用しない方が常に適切です。

5. メモリ不足の処理

大規模なアプリケーションがout of memory errorに直面することは非常に一般的であり、その結果、アプリケーションがクラッシュします。 これは非常に重要なシナリオであり、問​​題のトラブルシューティングのために複製するのは非常に困難です。

そのため、JVMには、ヒープメモリを物理ファイルにダンプするパラメータがいくつか付属しており、後でリークを見つけるために使用できます。

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

ここで注意すべき点がいくつかあります。

  • HeapDumpOnOutOfMemoryErrorは、OutOfMemoryErrorの場合にヒープを物理ファイルにダンプするようにJVMに指示します

  • HeapDumpPathは、ファイルが書き込まれるパスを示します。任意のファイル名を指定できます。ただし、JVMが名前に<pid>タグを見つけた場合、メモリ不足エラーの原因となっている現在のプロセスのプロセスIDが.hprof形式でファイル名に追加されます。

  • OnOutOfMemoryErrorは、メモリ不足エラーの場合に実行される緊急コマンドを発行するために使用されます。 cmdargsのスペースでは適切なコマンドを使用する必要があります。 たとえば、メモリ不足が発生したらすぐにサーバーを再起動する場合は、パラメーターを設定できます。

-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimitは、OutOfMemoryエラーがスローされる前にGCで費やされるVMの時間の割合を制限するポリシーです。

6. 32/64 Bit

32ビットパッケージと64ビットパッケージの両方がインストールされているOS環境では、JVMは32ビット環境パッケージを自動的に選択します。

環境を手動で64ビットに設定する場合は、以下のパラメーターを使用して設定できます。

-d

OSビットは32または64のいずれかです。 これに関する詳細は、hereにあります。

7. Misc

  • -server:「サーバーホットスポットVM」を有効にします。このパラメーターは、64ビットJVMでデフォルトで使用されます

  • -XX:+UseStringDeduplicationJava 8u20は、同じString;のインスタンスを作成しすぎてメモリの不要な使用を減らすために、このJVMパラメータを導入しました。これにより、重複するString値が減り、ヒープメモリが最適化されます。単一のグローバルchar []配列に

  • -XX:+UseLWPSynchronization:スレッドベースの同期ではなくLWPLight Weight Process)–ベースの同期ポリシーを設定します

  • -XX:LargePageSizeInBytes:は、Javaヒープに使用される大きなページサイズを設定します。 GB / MB / KB単位の引数を取ります。ページサイズを大きくすると、仮想メモリハードウェアリソースをより有効に活用できます。ただし、これによりPermGenのスペースサイズが大きくなる可能性があり、Javaヒープスペースのサイズを強制的に縮小する可能性があります。

  • -XX:MaxHeapFreeRatio:縮小を回避するために、GC以降のヒープフリーの最大パーセンテージを設定します。

  • -XX:MinHeapFreeRatio:拡張を回避するためにGCの後にヒープフリーの最小パーセンテージを設定します。ヒープの使用状況を監視するには、JDKに付属のVisualVMを使用できます。

  • -XX:SurvivorRatioeden /survivor space sizeの比率–たとえば、-XX:SurvivorRatio=6は、各survivor spaceeden spaceの比率を1:6に設定します。

  • -XX:+UseLargePages:システムでサポートされている場合は、大きなページメモリを使用します。このJVMパラメータを使用するとOpenJDK 7がクラッシュする傾向があることに注意してください**

  • -XX:+UseStringCache:は、Stringプールで使用可能な一般的に割り当てられた文字列のキャッシュを有効にします**

  • -XX:+UseCompressedStrings:純粋なASCII形式で表すことができるStringオブジェクトにbyte[]タイプを使用します

  • -XX:+OptimizeStringConcat:可能な場合はStringの連結操作を最適化します**

8. 結論

この簡単な記事では、一般的なアプリケーションのパフォーマンスを調整および改善するために使用できるいくつかの重要なJVMパラメーターについて学びました。

これらの一部は、デバッグ目的にも使用できます。

参照パラメーターをより詳細に調べたい場合は、hereを開始できます。