6

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

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

并得到171M。有没有办法计算这个大小?

4

3 回答 3

3

有没有办法计算这个大小?

否。最大可分配对象大小取决于堆中可用的连续可用空间量。AFAIK,除了做你目前正在做的事情之外,没有任何实用的方法可以找出可能是什么。

于 2013-04-27T03:59:14.413 回答
0

这很有趣,我用同样的方法运行:

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

但是我经常用 AggressiveHeap 得到更少的东西。

于 2013-04-27T06:07:41.580 回答
0

该解决方案是一个坏主意。在 JVM 中运行的任何其他进程都可能无法分配内存(因为这段代码将其全部抓取),这可能会导致问题。

由于进程开始磁盘交换,系统性能可能会受到影响。根据 JVM 的工作方式,它可能会做很多工作来初始化您从未访问过的内存。

你可以试试:

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

有关它们返回的限制,请参阅文档。

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

如果您打算使用它,您可能还需要Instrumentation.getObjectSize()了解对象的大致大小。坦率地说,访问仪器比应有的麻烦更多。这是关于如何的答案:在 Java 中,确定对象大小的最佳方法是什么?

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

于 2018-04-02T10:17:29.733 回答