はじめに
JDK12、13、14のGCチューニングの秘密を知りたいですか?この3つのバージョンのJVMの新機能を知りたいですか?
GCの変更のJDK12、13、14はあまりにも大きくないので、GCのチューニングのヒントのこの問題を見てみましょう、ここで一緒に記事の終わりの要約を行うには、対応するPDFのダウンロードが付属していますので、私はあなたが楽しむことができることを願っています。
優れたVMパラメータ
このバージョンではカバーされていない、より便利なVMパラメータをいくつか紹介します。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=path
java.lang.OutOfMemoryError例外が報告されたプロシージャは、しばしば遭遇java.lang.OutOfMemoryErrorを書いて、この時間はどのようにそれを解決するための優れた?
上級プログラマーはこのエラーを見るとすぐに、ヒープ領域が足りないのでヒープ領域を増やせということがわかります。
しかし、賢いプログラマーは、なぜこのOutOfMemoryError例外が発生するのか?プログラム内部に問題があるのでしょうか?
また、jcmd pid GC.heap_infoコマンドを使ってヒープ情報を見ることができるプログラマーもいるでしょう。
これらは良いことですが、上記の2つのJVMオプションを使用すると、OutOfMemoryErrorが発生するたびにプログラムが自動的にヒープをダンプし、デフォルトのファイル名はjava_pid.hprofになります。
-XX:+PrintClassHistogram
クラス情報をカウントする必要がある場合は、このオプションを使用できます。
ウィンドウズ環境ではControl+C、リナックス環境ではControl+Break信号を受信すると、対応する統計イベントがトリガーされます。
Control+CとControl+Breakシグナルって一体何?Javaプログラムにシグナルを渡すには?
killコマンドでシグナルを送ることができます。
実はkillには2つの使い方があります。
最初のkill pidは、killの後にpidが直接続きます。
2番目のkill -TERM pidでは、TERMはkillに渡すシグナルです。
実際、kill pidはkill -15 pidの略語です。
は、kill -l を使って、kill がサポートしているシグナルの種類を確認します:
kill -l 
 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
よく使われる9 = SIGKILLは、JVMに強制終了させるシグナルです。
これらのシグナルのうち、プロセスを無条件に終了させることができるシグナル9を除いて、プロセスにはそれらを無視する権利があることに注意してください。プロセスを終了させるためにkill pidコマンドを使っても、プロセスが応答しないことがあります。これはプロセスが壊れているのではなく、あなたが送ったシグナルを無視しているからです。
-XX:+PrintConcurrentLocks
このパラメータは、jstack -lまたはjcmd pid Thread.print -lと同じ効果があります。
-XX:+PrintFlagsRanges
もう一つ便利なパラメータ、PrintFlagsRangesを見てみましょう。あるVMパラメータを使いたいが、そのパラメータの値域がわからないことがあります:
便利でしょう?
G1
JVMが進化したことで、G1パラメータも進化し、これらのバージョンではG1パラメータの名前がいくつか変更されています:
-XX:DefaultMaxNewGenPercent を -XX:G1MaxNewSizePercent=percent に置き換えます。
-XX:G1OldCSetRegionLiveThresholdPercentを-XX:G1MixedGCLiveThresholdPercent=percentに置き換えます。
-XX:DefaultMinNewGenPercentが-XX:G1NewSizePercent=percentに置き換えられました。
FlightRecorderの設定
Java Flight Recorderは、JVMの診断およびパフォーマンス分析ツールです。jfrはJVMに統合されているため、jfrがJVMのパフォーマンスに与える影響は非常に小さく、安心して使用できます。
一般的に、デフォルト設定を使用した場合のパフォーマンスへの影響は1%未満です。
JFRは、イベントをバイナリ形式で書き込む高性能なバックエンドを備えた、オーバーヘッドの少ないイベントベースの分析エンジンです。
JFRは、JVMのチューニングツールであり、JVMとJavaアプリケーションの様々なイベントのノンストップの収集を通じて、その後のJMC分析のためのデータを提供するように。
イベントは、タイムスタンプ、イベント名、データの 3 つの部分で構成されます。また、JFR は、一定時間継続するイベント、即座にトリガーされるイベント、サンプリングされるイベントの 3 種類のイベントを扱います。
パフォーマンスへの影響を最小限に抑えるには、JFRを使用する際に必要なイベントの種類を選択してください。
JFRはJVMからイベントを収集した後、それを小さなスレッドローカルキャッシュに書き込み、次にそれをグローバルインメモリキャッシュにフラッシュし、最後にキャッシュされたデータをディスクに書き込みます。
あるいは、JFRがディスクに書き込まないように設定することもできますが、その場合、イベント情報の一部だけがキャッシュに保存されます。
FlightRecorderには2つの設定部分があり、最初の部分はFlightRecorder自体のサイズ、ストレージ、その他の情報を設定します。2つ目はFlightRecorderを起動するためのオプションです。
FlightRecorder 関連の設定パラメータを見てください:
-XX:FlightRecorderOptions:parameter=value
以下は StartFlightRecording の設定です:
-XX:StartFlightRecording=parameter=value
RAM
デフォルトでは、JVMのMaxHeapSizeはRAMのサイズに基づいて自動的に設定されます。例えば、8GのRAMを搭載したマシンを使用している場合、以下のコマンドを実行します:
java -XX:+PrintFlagsFinal -version | grep -Ei "maxheapsize|maxram"
MaxHeapSize = MaxRAM / MaxRAMPercentage であることがわかります。
VMには、RAM関連のパラメータを設定するための以下の機能もあります:
-XX:MaxRAM=size
-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
主なことは、RAMの最大値とヒープとRAMの比率を設定することです。
RAMパラメータは、主にコンテナ内でjavaを実行するために設定します。
JDK13のZGC
ZGCはスケーラブルで低レイテンシのGCです。ZGCは並行処理で、実行中のスレッドを停止する必要はありません。
ZGCはJDK11で導入されました。
以下の方法でZGCを有効にしてください:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
RTM
Restricted Transactional Memoryは、インテルがx86マイクロアーキテクチャで導入した命令セットシステムで、TSX命令セット拡張の一部です。
RTMは主にマルチスレッド環境での実行効率を向上させるために使用されます。
RTMはハードウェアによって使用され、操作中のデータ競合を自動的に検出してトランザクション操作が正しいことを保証し、操作間の並列性を発掘します。
また、RTM は CPU キャッシュラインの誤共有を低減します。
RTMサポートには4つの主要パラメータがあります:
-XX:+UseRTMLocking
-XX:+UseRTMDeopt
-XX:RTMAbortRatio=abort_ratio
-XX:RTMRetryCount=count
UseRTMDeopt と RTMAbortRatio が併用される場合。
RTMについて話すと、粗視化されたロックに対して最適化されますが、複数のスレッドが同じリソースにアクセスするために同時に実行されている場合、この最適化は実際には失敗し、中断され、通常のロック状態にフォールバックされます。
アボートが一定の割合を超えると、RTMコードは逆最適化されます。
まとめ
さて、まとめは以上です。以下はJDK12、13、14のGCチューニングの秘訣です。
この記事を書いた人: Flydean procedure those things
この記事へのリンク
出典:フライディーンブログ





