给定一个堆转储或正在运行的VM,我如何发现永久代的内容是什么?我知道“jmap -permstat”,但是在Windows上不可用。

最佳答案

本文Memory Monitoring with Java SE 5描述了如何以编程方式发现有关堆使用情况,内存池(包括permgen空间)等的信息。它非常简单:

    MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
    long nonHeapFree = usage.getMax() - usage.getUsed();
    long nonHeapTotal = usage.getMax();

在我对OSX(Sun VM)的测试中,“非堆内存使用情况”紧密匹配为permgen池返回的值,并且大概会在没有permgen的VM上做一些有用的事情。

10-06 14:11