2012年11月17日土曜日

JVMの使用メモリサイズの測り方

JavaにおけるJVMの使用メモリサイズの測り方のメモです。


基礎知識
まず、JVMは以下の様なメモリプールを持ちます。
+----------------------------------------------+
+////////////////           |
+----------------------------------------------+
 |--------|
 init
 |---------------|
 used
 |-----------------------|
 committed 
 |----------------------------------------------|
 max

ここで、
initは、JVMが起動時にOSに要求するメモリ容量
usedは、現在のメモリ使用量
committedは、使用出来る状態になっているメモリ空間の容量
maxは、JVMが利用できるメモリ容量の最大値
となります。

また、JVMでは、2種類のメモリ(ヒープとそれ以外)を管理しています。
ヒープメモリ:ヒープは実行時データ領域であり、ここからすべてのクラスインスタンスと配列のメモリーが割り当てられます。

ヒープ以外:実行定数プール、フィールド及びメソッドデータ、メソッド及びコンストラクタのコードなど、クラス単位の構造体が格納されます。


以下に、これらのメモリ情報を取得するコードを載せておきます。


ソースコード
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;

public class MemoryTester {
 // Java仮想マシンのメモリ管理システムにアクセスするためのオブジェクトを取得
 private static MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
 
 public static void main(String[] args) {
  MemoryTester tester = new MemoryTester();
  tester.testMemoryMXBean();
  tester.testRuntime();
 }
 
 private void testMemoryMXBean() {
  System.out.println("\ntestMemoryMXBean");
  
  // ヒープメモリの使用量の情報を持つオブジェクトを取得する
  MemoryUsage heap = mbean.getHeapMemoryUsage();
  System.out.println("heap init:" + heap.getInit());
  System.out.println("heap used:" + heap.getUsed());
  System.out.println("heap committed:" + heap.getCommitted());
  System.out.println("heap max:" + heap.getMax());
  System.out.println(heap);
  
  // ヒープ以外のメモリの使用量の情報を持つオブジェクトを取得する
  MemoryUsage nonHeap = mbean.getNonHeapMemoryUsage();
  System.out.println("nonHeap init:" + nonHeap.getInit());
  System.out.println("nonHeap used:" + nonHeap.getUsed());
  System.out.println("nonHeap committed:" + nonHeap.getCommitted());
  System.out.println("nonHeap max:" + nonHeap.getMax());
  System.out.println(nonHeap);
 }
 
 private void testRuntime() {
  System.out.println("\ntestRuntime");
  // Runtimeによるヒープメモリの取得
  Runtime runtime = Runtime.getRuntime();
  System.out.println("heap committed:" + runtime.totalMemory());
  System.out.println("heap used:" + (runtime.totalMemory() - runtime.freeMemory()));
  System.out.println("heap max:" + runtime.maxMemory());
 }
}

0 件のコメント:

コメントを投稿