Java 如何从JVM中获得堆和permgen的最大大小?

Java 如何从JVM中获得堆和permgen的最大大小?,java,memory-management,jvm,Java,Memory Management,Jvm,我试图以编程的方式找出调用我的程序的JVM的最大permgen和最大堆大小,而不是它们当前可用的大小 有办法吗 我熟悉Java运行时对象中的方法,但不清楚它们真正提供了什么 或者,有没有办法询问Eclipse为这两个项目分配了多少 试试这个: MemoryMXBean mem = ManagementFactory.getMemoryMXBean(); mem.getHeapMemoryUsage().getUsed(); mem.getNonHeapMemoryUsage().getUsed(

我试图以编程的方式找出调用我的程序的JVM的最大permgen和最大堆大小,而不是它们当前可用的大小

有办法吗

我熟悉Java运行时对象中的方法,但不清楚它们真正提供了什么

或者,有没有办法询问Eclipse为这两个项目分配了多少

试试这个:

MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
mem.getHeapMemoryUsage().getUsed();
mem.getNonHeapMemoryUsage().getUsed();

但它们只提供快照数据,而不是累积值。

至于eclipse,请尝试寻找分析工具。我认为默认情况下NetBeans有一个。

为max perm gen尝试类似的方法:

public static long getPermGenMax() {
    for (MemoryPoolMXBean mx : ManagementFactory.getMemoryPoolMXBeans()) {
        if ("Perm Gen".equals(mx.getName())) {
            return mx.getUsage().getMax();
        }
    }
    throw new RuntimeException("Perm gen not found");
}

对于max heap,您可以从运行时获得此信息,不过您也可以使用适当的MemoryPoolMXBean。

我正在尝试从程序中执行此操作,以便在用户使用的插件少于我的插件要求时向他们发出警告。我误解了您的问题。我认为这是一个更好的答案。请注意,非堆内存还包括代码缓存,它与永久生成是分开的。(至少在Sun的JVM中)要小心,就像激活CMS一样,MX bean的名称是“CMS Perm Gen”。你可以用mx.getName().endsWith(“Perm-Gen”)替换“Perm-Gen”.equals(mx.getName())使其在这种情况下也能工作。不知道它取决于什么,但对我来说这是“PS-Perm-Gen”。-)