JVM GCログの詳細な分析と構成(1)

JVMGCログパラメータ

場合:
2021-03-25T13:00:41.631+0800: 4.013: [GC (Allocation Failure) [PSYoungGen: 419840K->20541K(472064K)] 419840K->20573K(996352K), 0.0118345 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

詳細は以下のとおりです。

  • 2021-03-25T13:00:41.631 + 0800:GCが発生する時点。
  • 4.013:システムが実行されている時間(秒単位)の後に発生したGCは、システムが4.013秒間実行された後に発生したGCです。
  • GC(割り当ての失敗):GCをトリガーする理由を説明します。ここでは、オブジェクトの割り当ての失敗によって引き起こされたGCを指します。
  • PSYoungGen:Parallel Scavengeガベージコレクターを使用して、トリガーされる若い世代のガベージコレクションを参照します。
  • 419840K-> 20541K:若い世代でGCが実行されました。GCの前は、若い世代は419840Kを使用していました。GCの後、20541Kのオブジェクトが存続しました。
  • (472064K):若い世代が使用できるスペースは472064K、つまり461Mです。なぜ461Mなのですか?若い世代のサイズは512M、エデンエリアは409.6M、2つのサバイバーエリアはそれぞれ51.2Mであるため、若い世代が利用できるスペースはエデン+1サバイバーのサイズである460.8Mです。約461M。
  • 419840K-> 20573K:GCの前は、ヒープメモリ全体が419840Kを使用し、GCの後、ヒープメモリは20573Kを使用していました。
  • (996352K):ヒープ全体のサイズは996352Kで、これは973Mであり、実際には若い世代では461M +古い世代では512Mです。
  • 0.0118345秒:このGCで費やされた時間
  • 時間:user = 0.00 sys = 0.00、real = 0.01秒:このGCで費やされた時間
Heap
 PSYoungGen      total 472064K, used 406352K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 419840K, 93% used [0x00000000e0000000,0x00000000f7f00528,0x00000000f9a00000)
  from space 52224K, 27% used [0x00000000f9a00000,0x00000000fa7d3d70,0x00000000fcd00000)
  to   space 52224K, 0% used [0x00000000fcd00000,0x00000000fcd00000,0x0000000100000000)
 ParOldGen       total 524288K, used 189923K [0x00000000c0000000, 0x00000000e0000000, 0x00000000e0000000)
  object space 524288K, 36% used [0x00000000c0000000,0x00000000cb978d08,0x00000000e0000000)
 Metaspace       used 111852K, capacity 117676K, committed 117888K, reserved 1153024K
  class space    used 13876K, capacity 14914K, committed 14976K, reserved 1048576K

詳細は以下のとおりです。

  • PSYoungGen合計472064K、使用済み406352K:Parallel Scavengeコレクターを担当する若い世代が合計472064K(461M)のメモリを持ち、現在406352K(396.8M)を使用していることを示します。
  • エデンスペース419840K、93%使用済み:エデンエリアのスペースは419840K(410M)で、93%が使用されています。
  • From space 52224K、27%使用済み:From Survivorエリアのスペースは52224K(51M)で、27%が使用されています。
  • to space 52224K、0%使用:To Survivorエリアのスペースは52224K(51M)です。0%を使用すると、完全に解放されます。
  • ParOldGenの合計524288K、189923Kを使用:Parallel Oldコレクターが担当する旧世代の合計524288K(512M)を指し、現在189923K(185.4M)を使用しています。
  • オブジェクトスペース524288K、36%使用済み:古いスペースの合計サイズは524288K(512M)、36%使用済みです。
  • メタスペースとクラススペース:メタスペースメタデータスペースとクラススペース、総容量、使用メモリなど。
    ここに画像の説明を挿入
-XX:+ PrintGC(シンプルモード)
12.097: [GC (Allocation Failure)  419840K->18067K(996352K), 0.0197196 secs]
30.677: [Full GC 243120K->241951K(629760K), 1.5589690 secs]

このパラメータは、単純ログモードをオンにするだけで、各ヤングジェネレーションGCおよび各フルGCの情報行を出力します。

最初はGCタイプ(GCまたはフルGC)、次にGCの理由(割り当ての失敗:割り当てられたオブジェクトスペースが不十分な場合は新世代のGCになります)、GCの前後の使用済みヒープスペース、および現在のヒープ括弧容量、そして最後にこのGCの時間(秒単位)。

最初の行は、新世代GCの使用済みヒープスペースが419840Kから18067Kに削減され、現在のヒープ容量が996352K、GC期間が0.01197196秒であることを意味します。

シンプルモードのGCログ形式は、GCアルゴリズムとは関係ありません。ログは多くの情報を提供せず、GCが一部のオブジェクトを若い世代から古い世代に移動したかどうかをログから判断することはできません。したがって、詳細モードGCの方が便利です。

-XX:PrintGCDetails(詳細モード)

このコマンドを使用すると、詳細なGCログモードがオンになります。このモードでは、ログ形式は使用されるGCアルゴリズムに関連しています。

6.609: [GC (Allocation Failure) [PSYoungGen: 419840K->17473K(472064K)] 419840K->17561K(996352K), 0.0175394 secs] [Times: user=0.13 sys=0.00, real=0.02 secs] 
12.399: [GC (Allocation Failure) [PSYoungGen: 437313K->32044K(472064K)] 437401K->32156K(996352K), 0.0302068 secs] [Times: user=0.11 sys=0.00, real=0.03 secs] 
[Full GC
    [PSYoungGen: 10752K->9707K(142848K)]
    [ParOldGen: 232384K->232244K(485888K)] 243136K->241951K(628736K)
    [PSPermGen: 3162K->3161K(21504K)], 1.5265450 secs
]

これは若い世代のGCであり、新世代の使用済みヒープスペースが419840Kから17473Kに減少し、新世代の使用可能スペースが472064Kであることが簡単にわかります。GCが使用される前のヒープ全体が419840Kであり、ヒープ全体がGCの後に使用されます。17561Kでは、ヒープ全体のサイズは996352K(新世代+旧世代)で、0.0175394秒かかり、使用されるガベージコレクターはPS(Parallel Scavenge)です。

Timesには、GCが使用するCPU時間情報(user + sys = 0.13s time)が含まれます。これは、オペレーティングシステムのユーザースペースとシステムスペースがそれぞれ使用する時間であり、GCの実行時間(real = 0.02秒)です。 、0.02は概算値です)、CPU時間(0.13s)が実際の時間(real = 0.02)よりも大幅に長い場合、結論を導き出すことができます。GCはマルチスレッド操作を使用するため、CPU時間はCPU時間です。すべてのGCスレッドで費やされた合計。

フルGCも同様です。フルGCは、アプリケーションまたは外部JVMインターフェースを介して表示される要求によってトリガーすることもできます。これにより、出力ログが「フルGC(システム)」であるため、トリガーされたGCをログで簡単に区別できます。 「フルGC」の。

シリアルガベージコレクターの場合、詳細なGCログはスループットガベージコレクターと非常によく似ています。唯一の違いは、異なる世代のログが異なるGCアルゴリズムを使用する可能性があることです(たとえば、古い世代のログは、ParOldGenではなくTenuredで始まる場合があります)。ログの行の先頭としてガベージコレクターを使用すると、ログからJVMのGC設定を判断しやすくなります。

CMSガベージコレクターの場合、若い世代の詳細なログもスループットガベージコレクターと非常に似ていますが、古い世代のログはそうではありません。CMSガベージコレクターの場合、旧世代のGCは、異なるタイムスライスでアプリケーションと同時に実行されます。GCログは当然フルGCログとは異なります。また、この期間中、異なるタイムスライスのログが若い世代のGCログと混合されます。ただし、上記で紹介したGCログの基本要素を理解した後は、さまざまなタイムスライスのログを理解することは難しくありません。GCの実行時間を解釈するときは、特に注意してください。タイムスライス内のほとんどのGCはアプリケーションと同時に実行されるため、必ずしもGCが排他的GCよりも長く続くことを意味するわけではありません。何か問題があります。

セクション7で学習したように、CMSガベージコレクターがCMSサイクルを完了しなくても、フルGCが発生する可能性があります。GCが発生した場合、ログには、よく知られている「同時モード障害」(同時リカバリ障害)など、フルGCをトリガーする理由が含まれます。

-XX:+ PrintGCTimeStamps和-XX:+ PrintGCDateStamps

-XX:PrintGCTimeStampsを使用して、実際の日付と日付をGCログに追加します。これは、JVMの開始から現在までのタイムスタンプが各行に追加されることを示します。

6.195: [GC (Allocation Failure) [PSYoungGen: 419840K->17894K(472064K)] 419840K->17982K(996352K), 0.0213569 secs] [Times: user=0.00 sys=0.03, real=0.02 secs] 

-XX:PrintGCDateStampsが指定されている場合、絶対的な日付と時刻が各行に追加されます。

2021-03-31T13:58:47.268+0800: 6.963: [GC (Allocation Failure) [PSYoungGen: 419840K->16662K(472064K)] 419840K->16750K(996352K), 0.0325293 secs] [Times: user=0.08 sys=0.02, real=0.03 secs] 

必要に応じて、両方のパラメーターを同時に使用できます。異なるソースからのGCログを相互に関連付けるときに役立つため、これら2つのパラメーターを同時に使用することをお勧めします。

-Xloggc

デフォルトのGCログが端末に出力され、-Xloggc:./ gc.logは、指定されたファイルへの出力を指定します。このパラメーターは、パラメーター-XX:+ PrintGCおよび-XX:+ PrintGCTimeStampsを暗黙的に設定することに注意してください。ただし、防止するために新しいバージョンのJVMに変更がある場合は、表示されるこれらのパラメーターを設定することをお勧めします。

管理可能なJVMパラメーター、よく議論される質問は、本番環境でGCログをオンにする必要があるかどうかです。これは、生成されるオーバーヘッドが通常非常に限られているため、オンにする必要があることをお勧めしますが、そうではありません。 JVMを起動するときに必ず必要です。GCログパラメータを指定します。

HotSpot JVMには、管理可能なパラメーターと呼ばれる特別なタイプのパラメーターがあります。これらのパラメーターの値は、実行時に変更できます。ここで説明するすべてのパラメーターと「PrintGC」で始まるパラメーターはすべて管理可能なパラメーターです。このようにして、いつでもGCログをオンまたはオフにすることができます。たとえば、JDKに付属のjinfoツールを使用してこれらのパラメーターを設定したり、JMXクライアントを介してHotSpotDiagnosticMXBeanのsetVMOptionメソッドを呼び出して設定したりできます。これらのパラメータ。例:PrintGC設定の場合、パラメーター1:PrintGC、パラメーター2:true。ログを印刷して、正常にセットアップします。

-XX:+ PrintGCApplicationConcurrentTime
2021-03-31T15:14:11.961+0800: 6.454: Application time: 0.1916132 seconds
2021-03-31T15:14:11.961+0800: 6.454: [GC (Allocation Failure) [PSYoungGen: 419840K->16530K(472064K)] 419840K->16618K(996352K), 0.0182229 secs] [Times: user=0.13 sys=0.00, real=0.02 secs] 

各ガベージコレクションの前に、プログラムの中断のない実行時間を出力します。

-XX:+ PrintGCApplicationStoppedTime
2021-03-31T15:17:27.106+0800: 0.408: Application time: 0.0001266 seconds
2021-03-31T15:17:27.106+0800: 0.408: Total time for which application threads were stopped: 0.0000742 seconds, Stopping threads took: 0.0000398 seconds

ガベージコレクション中のプログラムの一時停止時間を印刷します。上記と組み合わせることができます。

-XX:PrintHeapAtGC

GCの前後の詳細なスタック情報を印刷します

{Heap before GC invocations=1 (full 0):
 PSYoungGen      total 472064K, used 419840K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 419840K, 100% used [0x00000000e0000000,0x00000000f9a00000,0x00000000f9a00000)
  from space 52224K, 0% used [0x00000000fcd00000,0x00000000fcd00000,0x0000000100000000)
  to   space 52224K, 0% used [0x00000000f9a00000,0x00000000f9a00000,0x00000000fcd00000)
 ParOldGen       total 524288K, used 0K [0x00000000c0000000, 0x00000000e0000000, 0x00000000e0000000)
  object space 524288K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000e0000000)
 Metaspace       used 20878K, capacity 21480K, committed 21632K, reserved 1069056K
  class space    used 2766K, capacity 2937K, committed 2944K, reserved 1048576K
2021-03-31T15:23:07.849+0800: 8.961: [GC (Allocation Failure) [PSYoungGen: 419840K->14996K(472064K)] 419840K->15084K(996352K), 0.0182397 secs] [Times: user=0.00 sys=0.01, real=0.02 secs] 
Heap after GC invocations=1 (full 0):
 PSYoungGen      total 472064K, used 14996K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 419840K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f9a00000)
  from space 52224K, 28% used [0x00000000f9a00000,0x00000000fa8a5260,0x00000000fcd00000)
  to   space 52224K, 0% used [0x00000000fcd00000,0x00000000fcd00000,0x0000000100000000)
 ParOldGen       total 524288K, used 88K [0x00000000c0000000, 0x00000000e0000000, 0x00000000e0000000)
  object space 524288K, 0% used [0x00000000c0000000,0x00000000c0016010,0x00000000e0000000)
 Metaspace       used 20878K, capacity 21480K, committed 21632K, reserved 1069056K
  class space    used 2766K, capacity 2937K, committed 2944K, reserved 1048576K
}
-XX:+ PrintFlagsFinal

-XX:+ PrintFlagsFinalパラメーターを始動パラメーターに追加すると、システムのすべてのパラメーターが印刷され、構成したパラメーターまたはシステムのデフォルトのパラメーターを確認できます。このパラメーター構成は一時的に使用されません。システム構成を確認する場合のみ使用されます。または、JMXまたはjdkに付属のJavaVisualを介して構成パラメーターを表示できます。これは、システムの起動パラメータに表示されます。

    uintx MaxMetaspaceExpansion                     = 5451776                             {product}
    uintx MaxMetaspaceFreeRatio                     = 70                                  {product}
    uintx MaxMetaspaceSize                         := 134217728                           {product}
    uintx MaxNewSize                               := 536870912                           {product}
     intx MaxNodeLimit                              = 75000                               {C2 product}
 uint64_t MaxRAM                                    = 0                                   {pd product}
    uintx MaxRAMFraction                            = 4                                   {product}
   double MaxRAMPercentage                          = 25.000000                           {product}
     intx MaxRecursiveInlineLevel                   = 1                                   {product}
    uintx MaxTenuringThreshold                      = 15                                  {product}
     intx MaxTrivialSize                            = 6                                   {product}
     intx MaxVectorSize                             = 32                                  {C2 product}
    uintx MetaspaceSize                            := 134217728                           {pd product}

要約(GCログ印刷パラメーター構成):

GCログパラメータ設定の印刷:

方法1:

詳細なGCログのみを印刷し、指定したファイルに出力します

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:./gc.log

結果:

2021-03-31T15:31:05.603+0800: 6.487: [GC (Allocation Failure) [PSYoungGen: 419840K->16437K(472064K)] 419840K->16525K(996352K), 0.0220363 secs] [Times: user=0.02 sys=0.02, real=0.02 secs] 
2021-03-31T15:31:11.544+0800: 12.428: [GC (Allocation Failure) [PSYoungGen: 436277K->31456K(472064K)] 436365K->31560K(996352K), 0.0307199 secs] [Times: user=0.06 sys=0.03, real=0.03 secs] 
2021-03-31T15:31:19.701+0800: 20.585: [GC (Allocation Failure) [PSYoungGen: 451296K->38124K(472064K)] 451400K->38252K(996352K), 0.0416391 secs] [Times: user=0.09 sys=0.00, real=0.04 secs] 
2021-03-31T15:31:27.432+0800: 28.315: [GC (Allocation Failure) [PSYoungGen: 457964K->48005K(472064K)] 458092K->48149K(996352K), 0.0587718 secs] [Times: user=0.24 sys=0.00, real=0.06 secs] 

方法2:

詳細なGCログを印刷して指定したファイルに出力し、各GCの前後にスタック情報を印刷します

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-Xloggc:./gc.log

結果:

{Heap before GC invocations=1 (full 0):
 PSYoungGen      total 472064K, used 419840K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 419840K, 100% used [0x00000000e0000000,0x00000000f9a00000,0x00000000f9a00000)
  from space 52224K, 0% used [0x00000000fcd00000,0x00000000fcd00000,0x0000000100000000)
  to   space 52224K, 0% used [0x00000000f9a00000,0x00000000f9a00000,0x00000000fcd00000)
 ParOldGen       total 524288K, used 0K [0x00000000c0000000, 0x00000000e0000000, 0x00000000e0000000)
  object space 524288K, 0% used [0x00000000c0000000,0x00000000c0000018,0x00000000e0000000)
 Metaspace       used 22318K, capacity 22910K, committed 23168K, reserved 1069056K
  class space    used 2920K, capacity 3095K, committed 3200K, reserved 1048576K
2021-03-31T15:25:31.118+0800: 8.730: [GC (GCLocker Initiated GC) [PSYoungGen: 419840K->16575K(472064K)] 419840K->16663K(996352K), 0.0258389 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
Heap after GC invocations=1 (full 0):
 PSYoungGen      total 472064K, used 16575K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000)
  eden space 419840K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f9a00000)
  from space 52224K, 31% used [0x00000000f9a00000,0x00000000faa2fcb8,0x00000000fcd00000)
  to   space 52224K, 0% used [0x00000000fcd00000,0x00000000fcd00000,0x0000000100000000)
 ParOldGen       total 524288K, used 88K [0x00000000c0000000, 0x00000000e0000000, 0x00000000e0000000)
  object space 524288K, 0% used [0x00000000c0000000,0x00000000c0016028,0x00000000e0000000)
 Metaspace       used 22318K, capacity 22910K, committed 23168K, reserved 1069056K
  class space    used 2920K, capacity 3095K, committed 3200K, reserved 1048576K
}

JVMパラメータのオンラインチェックURL

JVMパラメータのオンラインチェック

おすすめ

転載: blog.csdn.net/qq_40093255/article/details/115353528