この記事では、主に、次のようにJava仮想マシンのGCログの理解を研究しています。
GCログを理解することは、Java仮想マシンメモリの問題に対処するための基本的なスキルです。
Javaコマンドタイプにパラメーターを追加することにより、対応するGCタイプを指定し、GCログ情報を印刷し、ファイルやその他のポリシーに出力します。
public class referencecountinggc {public object instance = null; private static final int one_mb = 1024 * 1024; private byte [] bigsize = new byte [2 * one_mb]; public static void main(] string [] args){testgc();} public static void testg( ReferenceCountinggc();参照countinggc objb = new ReferenceCountinggc(); obja.instance = objb; objb.instance = obja; obja = null; objb = null; system.gc();}}}}Javac ReferenceCountinggc.java
Java -xx:+printgcdateStamps -xx:+printgcdetails referenceCountinggc
対応するパラメーターリスト
-xx:+printgc出力gcログ
-xx:+printgcdetails gcの詳細なログ出力
-xx:+printgctimestamsタイムスタンプ出力GC(参照時間の形式)
-xx:+printgcdateStamps出力GCのタイムスタンプ(2013-05-04T21:53:59.234+0800などの日付の形式)
-xx:+printheapatgc GCの前後にヒープ情報を印刷します
-xloggc:../ logs/gc.logログファイルの出力パス
結果出力:
2016-03-20T14:34:55.118-0800:[GC [PSYounggen:6123K-> 400K(38912K)] 6123K-> 400K(125952K)、0.0012070秒] [時間:ユーザー= 0.00 SYS = 0.00、リアル= 0.00セクション]
2016-03-20T14:34:55.119-0800:[完全なGC [PSYounggen:400K-> 0K(38912K)] [PAROLDGEN:0K-> 282K(87040K)] 400K-> 282K(125952K) 0.0084640秒] [時間:user = 0.01 sys = 0.00、real = 0.01秒]
ヒープ
Psyounggen Total 38912K、使用1013k [0x00000007D5500000000、0x00000007D80000000、0x00000000000000000)
Eden Space 33792K、3%が使用[0x00000007D5500000、0x00000007D55FD7D0、0X00000007D76000000)
スペース5120Kから、0%が使用[0x00000007D7600000、0x00000007D7600000、0x00000007D7B000000)
スペース5120Kに、0%が使用[0x00000007D7B00000、0x00000007D7B00000、0X00000007D80000000)
PAROLDGEN合計87040K、282K [0x0000000780000000、0x00000007855000000、0x00000007d55000000)
オブジェクトスペース87040K、0%使用
pspermgen合計21504k、2628k [0x00000077ae00000000、0x000000077c3000000、0x00000007800000000)
オブジェクトスペース21504K、12%が使用[0x00000007AE00000000,0x0000000077B091380,0X00000077C3000000)
Psyounggenは新世代を意味し、この名前はコレクターによって決定されます。これは平行した掃除です。 paroldgen、永続的にpspermgen
GCにはGCとFull GCの2種類があることがわかります。今回はGCに世界を停止したという完全な声明があります。
クランGC(マイナーGC):クランで発生するごみ収集アクションを指します。ほとんどのJavaオブジェクトには生と死の特徴があるため、マイナーGCは非常に頻繁であり、一般的にリサイクル速度は非常に高速です。
古いGC(メジャーGC/フルGC):老年期に発生するGCを指します。主要なGCが現れますが、これには少なくとも1回はマイナーGCが伴うことがよくあります。主要なGCの速度は、通常、マイナーGCの10倍以上遅いです。
[GC [Psyounggen:6123K-> 400K(38912K)] 6123K-> 400K(125952K)、0.0012070秒] [時間:ユーザー= 0.00 SYS = 0.00、REAL = 0.00秒]]
上の正方形のブラケット内の6123K-> 400K(38912K)は、メモリ領域がGCの後にGC-> GCの前に容量を使用していることを示しています。
四角い括弧の外側の6123K-> 400K(125952K)は、JavaヒープがGC-> GCの後に容量を使用する前に容量を使用し、丸い括弧内の125952KがJava Heapの総容量です。
[時間:ユーザー= 0.00 SYS = 0.00、REAL = 0.00秒]は、それぞれユーザーがCPU時間、カーネル状態で消費するCPU時間、および壁の時計時間が操作の開始から終了まで経過したことを表します。 CPU時間と壁の時計時間の違いは、壁の時計時間には、ディスクI/Oを待つことやスレッドブロッキングを待つなど、さまざまな非運用待機時間が含まれていることですが、CPU時間にはこれらの時間が含まれていません。
いくつかのオフラインツールを使用して、SunのGchisto(https://java.net/projects/gchisto)やgcviewer(https://github.com/chewiebug/gcviewer)などのGCログを分析できます。これらはすべてオープンソースツールです。ユーザーは、オフライン分析のためにバージョン制御ツールを介してソースコードを直接ダウンロードできます。
上記は、Java仮想マシンのGCログの分析に関するものであり、すべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!