最も重要なJVMパラメータのガイド
1概要
このクイックチュートリアルでは、Java仮想マシンの設定に使用できる最もよく知られているオプションについて説明します。
** 2明示的ヒープメモリ
**
パフォーマンスに関する最も一般的な方法の1つは、アプリケーションの要件に従ってヒープメモリを初期化することです。
そのため、最小および最大ヒープサイズを指定する必要があります。それを達成するために以下のパラメータを使用することができます。
-Xms<heap size>[unit]
-Xmx<heap size>[unit]----
ここで、** __unit__ ** は、メモリ(** __heap size__ ** で示される)を初期化する単位を示す。単位は、GBの場合は** __ ‘g’ __ ** 、MBの場合は__ ** ‘m’ ** __、KBの場合は__ ** ‘k’ ** __とマークできます。
たとえば、JVMに最小2 GB、最大5 GBを割り当てたい場合は、次のように書く必要があります。
[source,text,gutter:,true]
-Xms2G -Xmx5G
Java 8以降、__https://blogs.oracle.com/poonam/about-g1-garbage-collector,-permanent-generation-and-metaspace[Metaspace]__のサイズは定義されていません。グローバル制限に達すると、JVMは自動的にそれを増やします。ただし、不要な不安定性を克服するために、次のように__Metaspace__ sizeを設定できます。 [source,text,gutter:,true]
-XX:MaxMetaspaceSize=<metaspace size>[unit]—-
ここで、
メタスペースサイズ
は
Metaspace
に割り当てたいメモリの量を表します。
オラクルのガイドライン
によると、利用可能なメモリ合計の次に、2番目に影響力のある要素はヒープの割合です。若い世代のために予約されています。
デフォルトでは、YGの最小サイズは1310 MB、最大サイズは無制限です。
それらを明示的に割り当てることができます。
-XX:NewSize=<young size>[unit]
-XX:MaxNewSize=<young size>[unit]----
=== ** 3ガベージコレクション
**
アプリケーションの安定性を高めるためには、正しいhttp://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html[Garbage Collection]アルゴリズムの選択が重要です。
JVMには4種類の__GC__実装があります。
** シリアルガベージコレクタ
** パラレルガベージコレクタ
** CMSガベージコレクタ
** G1ガベージコレクタ
これらの実装は以下のパラメータで宣言できます。
[source,text,gutter:,true]
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC
__ガベージコレクション__の実装に関する詳細はlink:/jvm-garbage-collectors[こちら]をご覧ください。 === ** 4 GCロギング ** アプリケーションの状態を厳密に監視するには、常にJVMガベージコレクションのパフォーマンスを確認する必要があります。これを行う最も簡単な方法は、__GC__アクティビティを人間が読める形式で記録することです。 以下のパラメータを使用して、__GC__アクティビティを記録できます。 [source,text,gutter:,true]
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[unit]-Xloggc:/path/to/gc.log
** __UseGCLogFileRotation__ ** は、log4j、s4ljなどと同様に、ログファイルのローリングポリシーを指定します。** __NumberOfGCLogFiles__ ** は、1つのアプリケーションライフサイクルで書き込めるログファイルの最大数を示します。 ** __GCLogFileSize__ ** はファイルの最大サイズを指定します。最後に、__ ** loggc ** __はその場所を表します。 ここで注意しなければならないのは、__GC__ログに日付ごとのタイムスタンプを印刷するために使用できる、さらに2つのJVMパラメーター(__ ** - XX:PrintGCTimeStamps ** __および__ ** - XX:PrintGCDateStamps ** __)があるということです。 たとえば、それぞれ最大50 MBの最大100個の__GC__ログファイルを割り当て、それらを______/home/user/log/'__の場所に保存する場合は、次の構文を使用できます。 [source,text,gutter:,true]
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log
ただし、問題は、バックグラウンドでシステム時間を監視するために常に1つの追加のデーモンスレッドが使用されることです。この動作により、パフォーマンス上のボトルネックが生じる可能性があります。だからこそ、プロダクションではこのパラメータを使わない方がいいのです。 === ** 5メモリ不足の処理 ** 大規模なアプリケーションがhttps://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html[メモリ不足エラー]に直面することはよくありますが、その結果、アプリケーションがクラッシュします。これは非常に重要なシナリオであり、問題をトラブルシューティングするために複製することは非常に困難です。 JVMにヒープメモリを物理ファイルにダンプするパラメータがいくつかあるのはそのためです。これは後でリークを見つけるために使用できます。 [source,text,gutter:,true]
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java__pid<pid>.hprof
-XX:OnOutOfMemoryError=”< cmd args >;< cmd args >”
-XX:+UseGCOverheadLimit
ここで注意すべき点がいくつかあります。 ** __ ** HeapDumpOnOutOfMemoryError ** __はJVMにヒープをダンプするように指示します。 __OutOfMemoryError__の場合の物理ファイル ** ** __HeapDumpPath__ ** は、ファイルが書き込まれる場所のパスを表します。どれか ファイル名を指定できます。ただし、JVMが名前に** <pid> ** タグを見つけた場合は、 メモリ不足エラーを引き起こしている現在のプロセスのプロセスID __.hprof__形式でファイル名に追加されます ** __ ** OnOutOfMemoryError ** __は緊急コマンドを発行するために使用されます。 メモリ不足エラーの場合に実行されます。 cmd引数のスペースには適切なコマンドを使用してください。たとえば、メモリ不足が発生したらすぐにサーバーを再起動する場合は、次のパラメータを設定できます。 [source,text,gutter:,true]
-XX:OnOutOfMemoryError=”shutdown -r”
** ** __UseGCOverheadLimit__ ** は、の割合を制限するポリシーです。 __OutOfMemory__エラーが発生するまでにGCで費やされたVMの時間 === ** 6. 32/64ビット ** 32ビットと64ビットの両方のパッケージがインストールされているOS環境では、JVMは自動的に32ビット環境パッケージを選択します。 環境を手動で64ビットに設定したい場合は、以下のパラメータを使用して設定できます。 [source,text,gutter:,true]
-d<OS bit>
OSビットは** 32 ** または** 64 ** のいずれかです。これに関するより多くの情報はhttp://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit__layering[ここ]にあります。 === ** 7. その他+ ** ** __ ** - server ** __:「Server Hotspot VM」を有効にします。このパラメータは 64ビットJVMのデフォルト ** __ ** - XX:UseStringDeduplication ** __:__Java 8u20__がこのJVMを導入しました あまりにも作成することによってメモリの不要な使用を減らすためのパラメータ 同じ__String; __の多くのインスタンスはこれによってヒープメモリを最適化します。 重複した__String__値を単一のグローバルchar[]配列に減らす ** __ ** - XX:UseLWPSynchronization ** __:__LWP__(__ライトウェイトプロセス__)を設定 - スレッドベースの同期ではなく、ベースの同期ポリシー ** ** __- XX:LargePageSizeInBytes __:** に使用するラージページサイズを設定 Javaヒープ。引数はGB/MB/KBです。より大きなページサイズで 仮想メモリのハードウェアリソースを有効活用できます。しかし、これ __PermGen__のスペースサイズが大きくなる可能性があります。 Javaヒープスペースのサイズを減らす ** __ ** - XX:MaxHeapFreeRatio ** __:ヒープフリーの最大パーセンテージを設定します 縮小を避けるために__GC__の後に。 ** __ ** - XX:MinHeapFreeRatio ** __:ヒープフリーの最小パーセンテージを設定します 拡張を避けるために__GC__の後。ヒープ使用量を監視するには、JDKに同梱されているhttps://visualvm.github.io/[Visual VM]を使用できます。 ** __ ** - XX:SurvivorRatio ** __:__eden __/__存続スペースサイズの比率__ - の場合 例:__-XX:SurvivorRatio = 6__は、各__survivor間の比率を設定します。 space__と__eden space__を1:6にする ** __ ** - XX:UseLargePages ** __:でサポートされている場合は、ラージページメモリを使用します。 システム;これを使うと__OpenJDK 7__がクラッシュする傾向があるので注意してください。 JVMパラメータ** ** ** ** ** ** __- XX:UseStringCache __:** は、よく割り当てられる文字列のキャッシュを有効にします。 __String__プールで利用可能** ** ** ** ** __ ** - XX:UseCompressedStrings ** __:__String__に__byte[]__タイプを使用 純粋なASCIIフォーマットで表現できるオブジェクト ** ** __- XX:+ OptimizeStringConcat __:** それは__String__連結を最適化します 可能な場合の操作** ** + ** ** === ** 8結論** この簡単な記事で、いくつかの重要なJVMパラメーターについて学びました。これは、一般的なアプリケーションのパフォーマンスを調整および改善するために使用できます。 これらのいくつかはデバッグ目的にも使用できます。 参照パラメータをさらに詳しく調べたい場合は、http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html[ここ]を始めることができます。