読者です 読者をやめる 読者になる 読者になる

HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

java.lang.management パッケージ - MemoryManagerMXBean インタフェース

Java Java 1.4 to 5.0

ManagementFactory クラスを介して取得できるMXBeanの一つが実装するインタフェース。

Java VMのメモリマネージャに関する情報を取得するためのインタフェース。メモリマネージャはJava VM中の1つ以上のメモリプールを管理する。以上、APIドキュメントの棒読み(謎)。この明確に説明できないあたり、ちゃんと勉強しなおさないとだめだな。
それはそれとして、とりあえず実際に実行してみる。
今回用いたのは、次のJava VM

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryManagerMXBean;
import java.util.List;

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.printf("%-20s = %s\n", "java.version", System.getProperty("java.version"));
        System.out.printf("%-20s = %s\n", "java.vendor", System.getProperty("java.vendor"));
        System.out.printf("%-20s = %s\n", "java.runtime.version", System.getProperty("java.runtime.version"));
        System.out.printf("%-20s = %s\n", "os.name", System.getProperty("os.name"));

        System.out.println("========");

        List<MemoryManagerMXBean> memoryManagerMXBeans = ManagementFactory.getMemoryManagerMXBeans();
        System.out.printf("%-20s: %s\n", "number of MXBeans", memoryManagerMXBeans.size());
        {
            int i = 0;
            for (MemoryManagerMXBean memoryManagerMXBean : memoryManagerMXBeans) {
                System.out.printf("[%2d]\n", i);
                System.out.printf("    %-24s: %s\n", "GarbageCollectorMXBean?", (memoryManagerMXBean instanceof GarbageCollectorMXBean));
                System.out.printf("    %s\n", "--------");
                System.out.printf("    %-24s: %s\n", "name", memoryManagerMXBean.getName());
                String[] memoryPoolNames = memoryManagerMXBean.getMemoryPoolNames();
                System.out.printf("    %-24s: %s\n", "memoryPoolNames.length", memoryPoolNames.length);
                for (int j = 0; j < memoryPoolNames.length; ++j) {
                    System.out.printf("        %-20s[%2d]: %s\n", "memoryPoolName", j, memoryPoolNames[j]);
                }
                System.out.printf("    %-24s: %s\n", "isValid", memoryManagerMXBean.isValid());
        
                ++i;
            }
        }
    }

}

MemoryManagerMXBeanのサブインタフェースとしてGarbageCollectorMXBeanがあるので、GarbageCollectorMXBeanなのかそうでないのかも併せて判定して表示。
Sun Java 2 SDK 1.5.0_11

java.version         = 1.5.0_11
java.vendor          = Sun Microsystems Inc.
java.runtime.version = 1.5.0_11-b03
os.name              = Windows Vista
========
number of MXBeans   : 3
[ 0]
    GarbageCollectorMXBean? : false
    --------
    name                    : CodeCacheManager
    memoryPoolNames.length  : 1
        memoryPoolName      [ 0]: Code Cache
    isValid                 : true
[ 1]
    GarbageCollectorMXBean? : true
    --------
    name                    : Copy
    memoryPoolNames.length  : 2
        memoryPoolName      [ 0]: Eden Space
        memoryPoolName      [ 1]: Survivor Space
    isValid                 : true
[ 2]
    GarbageCollectorMXBean? : true
    --------
    name                    : MarkSweepCompact
    memoryPoolNames.length  : 6
        memoryPoolName      [ 0]: Eden Space
        memoryPoolName      [ 1]: Survivor Space
        memoryPoolName      [ 2]: Tenured Gen
        memoryPoolName      [ 3]: Perm Gen
        memoryPoolName      [ 4]: Perm Gen [shared-ro]
        memoryPoolName      [ 5]: Perm Gen [shared-rw]
    isValid                 : true

IBM Java 2 SDK 1.5.0 SR10

java.version         = 1.5.0
java.vendor          = IBM Corporation
java.runtime.version = pwi32dev-20090707 (SR10 )
os.name              = Windows Vista
========
number of MXBeans   : 2
[ 0]
    GarbageCollectorMXBean? : false
    --------
    name                    : J9 non-heap manager
    memoryPoolNames.length  : 4
        memoryPoolName      [ 0]: class storage
        memoryPoolName      [ 1]: JIT code cache
        memoryPoolName      [ 2]: JIT data cache
        memoryPoolName      [ 3]: miscellaneous non-heap storage
    isValid                 : true
[ 1]
    GarbageCollectorMXBean? : true
    --------
    name                    : J9 GC
    memoryPoolNames.length  : 1
        memoryPoolName      [ 0]: Java heap
    isValid                 : true

大雑把に言えば、ヒープメモリを管理するメモリマネージャはGarbageCollectorMXBean。逆にGarbageCollectorMXBeanでないものはヒープメモリ以外で管理するもの、例えばClassオブジェクトとかバイトコードコンパイルしたネイティブコードとかを保持するメモリ領域を管理するメモリマネージャ、ということか。