如何从JVM获取堆和持久代的最大大小?

7

我正在尝试以程序方式找出JVM为我的程序调用时的最大permgen和最大堆大小,而不是当前可用的大小。

有没有办法做到这一点?

我熟悉Java Runtime对象中的方法,但它们提供的内容并不清楚。

或者,有没有办法询问Eclipse为这两个分配了多少空间?

3个回答

8

针对最大永久代尝试以下内容:

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");
}

对于最大堆,您可以从 Runtime 中获取,但也可以使用适当的 MemoryPoolMXBean。


1
注意,如果您激活CMS,则MX bean名称为“CMS Perm Gen”。您可以使用mx.getName()。endsWith(“Perm Gen”)替换“Perm Gen”。equals(mx.getName()),以使其在那种情况下起作用。 - Laurent Grégoire
不知道它依赖于什么,但对我来说这是“PS Perm Gen”。 :-) - Jan Goyvaerts

7
尝试这些方法:
MemoryMXBean mem = ManagementFactory.getMemoryMXBean();
mem.getHeapMemoryUsage().getUsed();
mem.getNonHeapMemoryUsage().getUsed();

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


1
请注意,非堆内存还包括代码缓存,这与永久代是分开的(至少在Sun的JVM中)。 - Joshua McKinnon

0
关于Eclipse,尝试寻找一个性能分析工具。我认为NetBeans默认就有一个。

我正在尝试从程序中实现这一点,以便如果用户使用的内容不足我的插件要求,我可以向他们发出警告。 - Uri
我误解了你的问题。我认为这是一个更好的答案。 - pek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接