4

私のJavaアプリケーション(Oracle JVM v1.6.0)でGCロギングが有効になっている場合、通常、終了時に次の出力が出力されます。

PSYoungGen      total 6429824K, used 5483163K [0x0000000640000000, 0x0000000800000000, 0x0000000800000000)
  eden space 5483456K, 99% used [0x0000000640000000,0x000000078eaa6cc0,0x000000078eaf0000)
  from space 946368K, 0% used [0x00000007c63d0000,0x00000007c63d0000,0x0000000800000000)
  to   space 910208K, 0% used [0x000000078eaf0000,0x000000078eaf0000,0x00000007c63d0000)
 ParOldGen       total 3145728K, used 3145724K [0x0000000580000000, 0x0000000640000000, 0x0000000640000000)
  object space 3145728K, 99% used [0x0000000580000000,0x000000063ffff3a0,0x0000000640000000)
 PSPermGen       total 57984K, used 57686K [0x000000057ac00000, 0x000000057e4a0000, 0x0000000580000000)
  object space 57984K, 99% used [0x000000057ac00000,0x000000057e455ae0,0x000000057e4a0000)

アプリケーションの実行中にこの出力を定期的に生成する方法はありますか?JMXを介してプログラムでメモリ使用量にアクセスするにはどうすればよいですか?しかし率直に言って、上記を生成するコードを再実装するのではなく、ショートカットを望んでいます。たとえば、JVMにkillシグナルを送信すると、上記の出力が強制されますか?

4

2 に答える 2

4

MXBeans の何が問題になっていますか? 実装はそれほど難しくありません。

私はそのようなものを使用しました:

    List<GarbageCollectorMXBean> gcList = ManagementFactory.getGarbageCollectorMXBeans();
    for(GarbageCollectorMXBean tmpGC : gcList){

        System.out.println("\nName: " + tmpGC.getName());
        System.out.println("Collection count: " + tmpGC.getCollectionCount());
        System.out.println("Collection time: " + tmpGC.getCollectionTime());
        System.out.println("Memory Pools: ");

        String[] memoryPoolNames = tmpGC.getMemoryPoolNames();
        for(String mpnTmp : memoryPoolNames){
            System.out.println("\t" + mpnTmp);
        }

    }

    System.out.println( "Memory Pools Info" );
    List<MemoryPoolMXBean> memoryList = ManagementFactory.getMemoryPoolMXBeans();
    for(MemoryPoolMXBean tmpMem : memoryList){

        System.out.println("\nName: " + tmpMem.getName());
        System.out.println("Usage: " + tmpMem.getUsage());
        System.out.println("Collection Usage: " + tmpMem.getCollectionUsage());
        System.out.println("Peak Usage: " + tmpMem.getPeakUsage());
        System.out.println("Type: " + tmpMem.getType());
        System.out.println("Memory Manager Names: ") ;

        String[] memManagerNames = tmpMem.getMemoryManagerNames();
        for(String mmnTmp : memManagerNames){
            System.out.println("\t" + mmnTmp);
        }
        System.out.println("\n");
    }

    MemoryUsage mu =ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
    MemoryUsage muNH =ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
    System.out.println(
            "Init :"+mu.getInit()+
            "\nMax :"+mu.getMax()+
            "\nUsed :"+mu.getUsed()+
            "\nCommited :"+mu.getCommitted()+
            "\nInit NH :"+muNH.getInit()+
            "\nMax NH :"+muNH.getMax()+
            "\nUsed NH:"+muNH.getUsed()+
            "\nCommited NH:"+muNH.getCommitted());
于 2012-06-12T19:38:24.350 に答える
2

この種の情報のランタイム出力を制御するオプションを使用して JVM を起動できます。

Java ツールのドキュメントを参照してください。

たとえば、コンソールに出力するには:

java -verbose:gc

またはファイルに出力するには:

java -Xloggc:your.log.file

これらのオプションのいずれかを使用すると、JVM は、VM の実行中 (終了時だけでなく)、すべての GC イベントをログに記録します。

于 2012-06-12T14:55:11.267 に答える