Javaヒープ領域内のメモリ使用状況の確認

前提知識

ガベージコレクション(GC)

アプリケーションが確保したメモリ領域の中で、不要になったものを開放する機能。

ヒープ領域内の構成

Java7の場合

大きく分けてNew, Old, Permanentの3つの領域に分けられる。
New領域はEden, Survivor領域に分けられる。
Survivor領域はFrom, To領域に分けられる。

  • New領域(Young):作成されたばかりのオブジェクト(インスタンスや配列)が格納される。
  • Old領域(Tenured):古いオブジェクト(Scavenge GCによりFromからToに移動した回数が閾値MaxTenuringThresholdを超えたオブジェクト)が格納される。
  • Permanent領域:クラスや定数など、恒久的に利用されるオブジェクトが格納される。
  • Eden領域:作成されたオブジェクトが最初に格納される領域。
  • Survivor領域:Scavenge GC後生き残ったオブジェクトが格納される領域。(生き残ったオブジェクトがEdenからSurvivorに移動される。)
  • From領域:前回のGC時のオブジェクトが格納されている領域。GCにより整理される対象。
  • To領域:GC時にEden, From領域で生き残ったオブジェクトが格納される領域。(生き残ったオブジェクトがEden, From領域からTo領域に移動する。)

※Scavenge GC(New GC, Minor GC):New領域対象のGC。Eden領域がいっぱいになると実行される。
※Full GC:Old, Permanent領域対象のGC。Old領域がいっぱいになると実行される。

Java8の場合

Permanent領域が廃止され、代わりにメタスペースが導入された。

  • メタスペース:クラスや定数など、恒久的に利用されるオブジェクトが格納される。

Permanent領域との違い:メタスペースはJavaヒープに存在しない。Nativeメモリ(OSが直に管理する領域)上に存在し、上限なく領域を取れる。デフォルトでは上限設定なし。(設定もできる。)

  • Compressed Class Space(CCS):クラス情報の一部が格納される。VMの高速化のため利用。メタスペースとは別の領域。

本題

jstatコマンド

上記で説明したJavaヒープ領域内の各領域の容量・使用量を取得できるコマンド。
JDKに標準で入っている。

測定対象のサンプルコード
import java.util.Scanner;

class test{
	public static void main(String args[]){
		double[] x = new double[10000];
		System.out.println("文字を入力してEnterで終了");
	    Scanner scan = new Scanner(System.in);
		String str = scan.next();
	}
}

上記をコンパイルして実行する。

PIDを確認
jps
jstatコマンド実行
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/bin/jstat -gc jpsコマンドで確認したPID
出力結果
Java8の場合
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
512.0  512.0   0.0    0.0    4416.0   989.1    10944.0      0.0     4480.0 873.3  384.0   74.6       0    0.000   0      0.000    0.000
説明
S0C Survivor領域0の現在の容量(KB)。
S1C Survivor領域1の現在の容量(KB)。
S0U Survivor領域0の使用率(KB)。
S1U Survivor領域1の使用率(KB)。
EC Eden領域の現在の容量(KB)。
EU Eden領域の使用率(KB)。
OC Old領域の現在の容量(KB)。
OU Old領域の使用率(KB)。
MC メタスペースの容量(KB)。
MU メタスペースの使用率(KB)。
CCSC 圧縮されたクラス領域の容量(KB)。
CCSU 使用されている圧縮されたクラス領域(KB)。
YGC Young世代のガベージ・コレクション・イベントの数。
YGCT Young世代のガベージ・コレクション時間。
FGC フルGCイベントの数。
FGCT フル・ガベージ・コレクションの時間。
GCT ガベージ・コレクションの総時間。
Java7の場合
説明
S0C Survivor領域0の現在の容量 (KB)
S1C Survivor領域1の現在の容量 (KB)
S0U Survivor領域0の使用率 (KB)
S1U Survivor領域1の使用率 (KB)
EC Eden領域の現在の容量 (KB)
EU Eden領域の使用率 (KB)
OC Old領域の現在の容量 (KB)
OU Old領域の使用率 (KB)
PC Permanent領域の現在の容量 (KB)
PU Permanent領域の使用率 (KB)
YGC 若い世代のGCイベント数
YGCT 若い世代のガベージコレクション時間
FGC フルGCイベント数
FGCT フルガベージコレクション時間
GCT ガベージコレクション総時間

このデバイスは現在使用中です。デバイスを使用しているプログラムまたはウィンドウを閉じてから、再試行してください。

Windows 10
タスクマネージャで確認しても実行中アプリがない時の対処法。

シャットダウンしてから取り外し

www.fonepaw.jp

クリーンブート

answers.microsoft.com

関連

バイスの取り外しポリシー「クイック削除」

webmaru.blog