Javaガベージコレクションログメッセージ


96

ガベージコレクション情報をログにダンプするようにjavaを構成しました(詳細なGC)。ログのガベージコレクションエントリの意味がわかりません。これらのエントリのサンプルを以下に掲載します。私はグーグルで周りを検索しましたが、確かな説明は見つかりませんでした。

ある程度の推測はありますが、信頼できる情報源に裏付けられた、エントリの数値の意味を厳密に定義した回答を探しています。sunのドキュメントを引用するすべての回答に対する自動+1。私の質問は:

  1. PSYoungGenは何を指しますか?前世代とは関係があると思いますが、具体的には?
  2. 2番目のトリプレットと最初のトリプレットの違いは何ですか?
  3. 名前(PSYoungGen)が最初のトリプレットの数値に指定されていて、2番目のトリプレットに指定されていないのはなぜですか?
  4. トリプレットの各数値(メモリサイズ)はどういう意味ですか。たとえば、109884K-> 14201K(139904K)は、GC 109884kの前のメモリで、その後14201Kに削減されます。3番目の数字はどのように関連していますか?なぜ2番目の数値セットが必要なのでしょうか。

8109.128:[GC [PSYoungGen:109884K-> 14201K(139904K)] 691015K-> 595332K(1119040K)、0.0454530秒]

8112.111:[GC [PSYoungGen:126649K-> 15528K(142336K)] 707780K-> 605892K(1121472K)、0.0934560秒]

8112.802:[GC [PSYoungGen:130344K-> 3732K(118592K)] 720708K-> 607895K(1097728K)、0.0682690秒]


ヒープ全体、ヒープの若い世代の一部、gcの動作に関するマイナーなgc、たとえばcubrid.org/blog/dev-platform/…を
MarianP

回答:


90

そのほとんどは、GCチューニングガイドで説明されています(とにかく読むとよいでしょう)。

コマンドラインオプション-verbose:gcを使用すると、ヒープとガベージコレクションに関する情報が各コレクションで出力されます。たとえば、大規模なサーバーアプリケーションからの出力を次に示します。

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

ここでは、2つのマイナーコレクションに続いて1つのメジャーコレクションが表示されます。矢印の前と後の数字(たとえば、325407K->83000K最初の行から)は、それぞれガベージコレクションの前と後のライブオブジェクトの合計サイズを示します。マイナーコレクションの後、サイズには、不要な(もはや生存していない)が再利用できないオブジェクトが含まれます。これらのオブジェクトは、古い世代に含まれているか、古い世代または永続的な世代から参照されています。

かっこ内の次の数値(たとえば、(776768K)最初の行から)は、ヒープのコミットされたサイズ、つまりオペレーティングシステムにメモリを追加要求せずにJavaオブジェクトが使用できるスペースの量です。常に1つしか使用できないため、この数にはサバイバースペースの1つが含まれておらず、仮想マシンが使用するメタデータを保持する永続的な世代も含まれていないことに注意してください。

行の最後の項目(例0.2300771 secs:)は、収集の実行にかかった時間を示します。この場合、約1/4秒です。

3行目のメジャーコレクションの形式は似ています。

によって生成される出力の形式は、-verbose:gc将来のリリースで変更される可能性があります。

PSYoungGenがあなたの中にある理由はよくわかりません。ガベージコレクターを変更しましたか?


gcログファイルはどこにありますか?
ルー氏、

7
この回答は、元の質問には実際には対応していません。マイケルジョセフの方がいいと思います。これは、イーサンからの質問に対応し、元の例を分解するのにより優れた仕事をします。彼の回答には2つの問題があります(彼のリンクは現在無効であり、rafa.ferreriaがもう1つを指摘しています)が、それはOracleドキュメントを逆流させるだけではありません。
Dirk

127
  1. PSYoungGenは、マイナーコレクションで使用されているガベージコレクターを指します。PSはParallel Scavengeの略です。
  2. 最初の数のセットは、若い世代の前/後のサイズであり、2番目のセットは、ヒープ全体に対するものです。(ガベージコレクションの問題の診断で形式の詳細を確認)
  3. 名前は問題の世代とコレクターを示し、2番目のセットはヒープ全体に対するものです。

関連するフルGCの例は、古い世代と永続的な世代に使用されるコレクターも示しています。

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

最後に、ログ出力例の1行を分解します。

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107Mbは GCの前に使用し、14MBは GC、最大若い世代のサイズの後に使用137Mb
  • 675Mbの GC、前に使用ヒープ581Mbの GC、後に使用するヒープの1Gb最大ヒープサイズ
  • マイナーGC は、JVMの開始から8109.128秒発生し 、0.04秒かかりました

8
ちょっとしたコメントですが、 '()'の間の値は最大サイズではなく、今のところ最大サイズです。GCがヒープを解放できなかった場合、この制限により、運用システムにはより多くのスペースが必要になり、この値は増加します。もちろん、以下に定義された制限を尊重します:-Xmx
rafa.ferreira

@ rafa.ferreira私は括弧の値、つまり1119040Kがコミットされたヒープサイズだと思います。おそらく、GCは「最大ヒープ」サイズをどこにでも出力します。参考文献1参考文献2
rohitmohta

23

詳細なGCログは

-XX:+PrintGCDetails 

パラメータ。次に、回答のようにPSYoungGenまたはPSPermGenの出力が表示されます。

また、-Xloggc:gc.logのように同じ出力を生成するようだ-verbose:gcが、あなたは最初に、出力ファイルを指定することができます。

使用例:

java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

データをよりよく視覚化するには、gcviewerを試してください(より新しいバージョンはgithubにあります)。

パラメータを正しく書き込むように注意してください。「+」を忘れたため、JBossはエラーメッセージなしで起動しませんでした。


3
Javaが再起動されると、gc.logが上書きされることに注意してください(メモリの問題が原因でTomcatを再起動した場合、そのgc.logを確認したい場合など)。または、GCログをローテーションすると、少なくともそうなります。GCロギングを制御する他の多くのオプションがあります。oracle.com/technetwork/articles/java/vmoptions-jsp-140102.htmlを参照してください。特に、次の点を考慮してください-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.