如果知道最大堆大小,如何计算最大对象大小?

时间:2013-04-27 03:46:58

标签: java

我使用-Xmx256M运行此测试以确定我可以在堆上创建的最大对象大小

    for (int m = 128;; m++) {
        try {
            byte[] a = new byte[m * 1024 * 1024];
        } catch (OutOfMemoryError e) {
            System.out.println(m + "M");
            break;
        }
    }

并获得171M。有没有办法计算这个尺寸?

3 个答案:

答案 0 :(得分:3)

  

有没有办法计算这个尺寸?

没有。最大可分配对象大小取决于堆中可用的连续可用空间的数量。 AFAIK,除了做你现在正在做的事情之外,没有切实可行的方法来找出它可能是什么。

答案 1 :(得分:0)

这很有趣,我用同样的东西:

 java -Xmx256M -XX:+AggressiveHeap HeapTest //I hoped this would help

但是我用AggressiveHeap不断减少。

答案 2 :(得分:0)

这个解决方案是个坏主意。在JVM中运行的任何其他进程可能无法分配内存(因为此代码全部抓住了它)并且这可能会导致问题。

由于进程启动磁盘交换,系统性能可能会受损。根据JVM的工作方式,初始化您永远不会访问的内存可能会做很多工作。

您可以尝试:

Runtime.getRuntime().freeMemory()
Runtime.getRuntime().maxMemory()
Runtime.getRuntime().totalMemory()

请参阅文档,了解它们返回的限制。

还要记住,虽然您可以以字节为单位获取这些值,但Java对象的大小是实现定义的并且仍然模糊不清。

如果您计划使用此功能,则可能还需要Instrumentation.getObjectSize()来了解对象的大致尺寸。坦率地说,访问仪器比应该更麻烦。以下是关于如何:In Java, what is the best way to determine the size of an object?

的答案

所有这些值仅供参考。它们在缓存策略中可能有意义,在这种策略中,您希望调整为可丢弃缓存分配的空间量,但不是用于任何目的的精确值。