Java仮想マシンGCログ分析


本論文で研究したのは主にJava仮想マシンにおけるgcログの理解問題であり、具体的には以下の通りである。
一、ログ分析
GCログを理解することはJava仮想マシンのメモリ問題を処理する基本的なスキルです。
javaコマンド種にパラメータを追加することで対応するgcタイプを指定し、gcログ情報を印刷してファイルに出力するなどのポリシーがあります。
1、javaコードを作成する

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 testGC() {
		ReferenceCountingGC objA = new ReferenceCountingGC();
		ReferenceCountingGC objB = new ReferenceCountingGC();
		objA.instance = objB;
		objB.instance = objA;
		objA = null;
		objB = null;
		System.gc();
	}
}
2、javaファイルをコンパイルする

javac ReferenceCountingGC.java 
3、クラスファイルの実行

java -XX:+PrintGCDateStamps -XX:+PrintGCDetails ReferenceCountingGC
対応するパラメータリスト
-XX:+PrintGC出力GCログ
-XX:+PrintGCDetails出力GCの詳細ログ
-XX:+PrintGCTimeStarmpsはGCのタイムスタンプを出力します(基準時間の形で)
-XX:+PrintGCDateStampsはGCのタイムスタンプを出力します(日付で2013-05-04 T 21:53:59.234+0800)
-XX:+PrintHeappatGCはGCを行う前後にスタックの情報を印刷します。
-Xlogc:./logs/gc.logログファイルの出力先
結果出力:
2016-03-20 T 14:34:55.118-800:[GC[PSYoungGen:6123 K-]400 K(38912 K)]6123 K->400 K(125952 K)、0.0012070 secs][Times:user=0.00 sys=0.00,real=0.00 secs]
2016-03-20 T 14:34:55.119-800:[Full GC[PSYoungGen:400 K->0 K(38912 K)][PartOldGen:0 K->282 K(87040 K)]400 K->>282 K[PSPermGen:2622 K->2621 K(2150 K)=merer.40
Heap
PSYoungGen total 38912 K、used 1013 K[0 x 00007 d 55000,0 x 0007 d 800,000]
eden space 33792 K,3%used[0 x 0007 d 5500000,0 x 0007 d 55 fd 7,0 x 0007 d 760000]
from space 5120 K,0%used[0 x 00007 d 7600000000,0 x 0007 d 7600000000,0,0 x 0007 d 7 b 00000]
to space 5120 K,0%used[0 x 00007 d 7 b 00000,0 x 0007 d 7 b 00000,0 x 00007 d 800000]
ParoldGen total 87040 K、used 2802 K[0 x 000780000、0 x 000785500 0000、0 x 00007 d 55000 00]
object space 87040 K、0%used[0 x 000780000,0 x 000780046 bf 8,0 x 000785500000]
PSPermGen total 21504 K、used 2628 K[0 x 00077 ae 0000、0 x 00077 c 30000、0 x 000780000]
object space 21504 K,12%used[0 x 00077 ae 0000,0 x 00077 b 09330,0 x 000770 c 30000]
PSYoungGenは新生代を表しています。この名前はコレクタによって決まります。ここのコレクタはParalel Scabiengeです。古い時代はPartOldGenで、永久代はPSPermGenです。
  • コレクタがPanewコレクタであれば、新生代はPanew、Paralel New Generation
  • である。
  • コレクタがSerialコレクタであれば、新生代はDefNew、Default New Generation
  • である。
    上には二つのGCタイプがあります。GCとフルGCは、今回GCはStop-Tohe-Worldが発生したというフルルがあります。
    新生代GC(Minor GC):新生代に発生したごみ収集動作を指し、Javaの対象は朝生夕滅の特性を備えていることが多いので、Minor GCは非常に頻繁で、一般的な回収速度は非常に速い。
    旧世代GC(Major GC/Full GC):旧世代のGCでMajor GCが出現し、常に少なくとも一回のMinor GCを伴うことがあり、Major GCの速度は普通ミノアGCより10倍以上遅くなります。
    [GC[PSYoungGen:6123 K->400 K(38912 K)]6123 K->400 K(125952 K)、0.0012070 secs)[Times:user=0.00 sys=0.00,real=0.00 secs]
    上の括弧の内部の6123 K->400 K(38912 K)は、GC前のメモリ領域が使用された容量->GC後のメモリ領域が使用された容量を表しています。後ろの括弧の中の38912 Kはこのメモリ領域の総容量です。
    大かっこの外側の6123 K->400 K(125952 K)は、GCの前にJavaスタックが使用された容量を表しています。GCの後にJavaスタックが使用された容量を表しています。後ろの丸括弧の中の125952 KはJavaスタックの総容量です。
    [Times:user=0.00 sys=0.00,real=0.00 secs]は、それぞれユーザが消費するCPU時間、カーネル状態が消費するCPU時間、および動作が開始から終了までの間に経過する壁時計時間、CPU時間と壁時計時間の違いを表します。壁時計時間は、各種の非運算待ち時間、例えば、ディスクI/O、スレッド待ち時間などを含みます。CPU時間にはこれらの時間が含まれていない。
    二、GCログのオフライン分析
    いくつかのオフラインツールを使用してGCログを分析することができます。例えば、sunのgchisto(https://java.net/projects/gchisto)、gcview(https://github.com/chewiebug/GCViewer これらはソースツールであり、ユーザーは直接バージョンコントロールツールを通じてソースコードをダウンロードし、オフライン分析を行うことができます。
    締め括りをつける
    以上が本論文のJava仮想マシンGCログ分析のすべての内容です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。