2

次のコードを使用して、自分のプログラムのメモリ使用量を監視しようとすると

public static String heapMemUsage() 
{
    long used = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();
    long max = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getMax();
    return ""+used+" of "+max+" ("+ used/(double)max*100.0 + "%)";
}

17 588 616jvisualvm (私のプログラムと jvisualvm) で見た結果とは少し異なる結果が得られまし18 639 640た。大したことではないことはわかっていますが、考えさせられました。

この事実について何か説明はありますか?

可能であればコード化されたバージョンを使用したいのですが、その結果が何らかの形でゆがんでいて、jvisualvm がより信頼できる場合は、代わりに jvisualvm を使用する必要があります。

ありがとう

4

1 に答える 1

3

VisualVM は同じアプローチを使用して必要な値を取得します。 MonitoredDataImpl.javaを確認してみましょう。

MonitoredDataImpl(Jvm vm,JmxSupport jmxSupport,JvmMXBeans jmxModel) {
    //...
    MemoryUsage mem = jmxModel.getMemoryMXBean().getHeapMemoryUsage();
    MemoryPoolMXBean permBean = jmxSupport.getPermGenPool();    
    //...
    genCapacity = new long[2];
    genUsed = new long[2];
    genMaxCapacity = new long[2];
    genCapacity[0] = mem.getCommitted();
    genUsed[0] = mem.getUsed();

    genMaxCapacity[0] = mem.getMax();

    if (permBean != null) {
        MemoryUsage perm = permBean.getUsage();
        genCapacity[1] = perm.getCommitted();
        genUsed[1] = perm.getUsed();
        genMaxCapacity[1] = perm.getMax();
    }
  }

したがって、とにかくあなたのアプローチを使用しても安全です。この問題を追跡するために、JVM のバージョンなどに関する追加情報を投稿してください。

于 2013-02-27T12:19:42.593 に答える