使用256 MB RAM,我们可以创建双数组的最大长度是多少?

时间:2011-12-24 12:00:45

标签: java memory

Code Ranch有这个问题:

  

28)如果我们有256 MB RAM,那么我们可以创建的双数组的最大长度是多少? (忽略jvm占用的内存和一切   别的)

     

答:    Integer.MAX_VALUE作为length()方法必须返回正确的'int'长度。

我不确定我是否理解他们提供的答案。据我所知,大多数实现使用64位表示双倍,这意味着我们可以在256 MB RAM中容纳大约4 194 304双倍(减去开销)。

那么在256 MB RAM环境中,双数组的最大长度怎么可能是2147483647?

下面的测试代码肯定会给我们OOM吗?:

public class test {
    public static void main(String[] args) {
        double[] d = new double[java.lang.Integer.MAX_VALUE - 8];
    }
}

3 个答案:

答案 0 :(得分:9)

编辑:下面的答案假设问题是询问可以在问题中指定的256MB内分配的数组的大小。如果不是问题的关键点,那么没有确定答案 - 因为最大长度将完全取决于已分配给JVM的内存量, JVM如何能够使用内存等。我们可能有256MB内存,但运行带有-Xmx64M的Sun JVM,因此可用的内存甚至少于256MB。

所以要么问题不好,要么答案错误 - 或者很可能两者兼而有之。


Code Ranch答案肯定是错误的:256MB是2 8 * 2 20 字节 - 即2 28 字节。每个double值占用8个字节,因此即使不考虑对象和长度的任何开销,可以存储在256MB中的double值的最大数量为2 23 Integer.MAX_VALUE是2 31 - 1,这显然要大得多。

(对于double使用64位的“大多数实现”不是问题,顺便说一下 - 这是规范所要求的。)

所以是的,如果你只有256MB的可用内存,你的测试代码确实会给出一个OOM。

鉴于该页面上的一些问题甚至没有答案,这个答案肯定是不正确的,而其他问题写得不好,我会完全忽略该页面。

答案 1 :(得分:1)

取决于您拥有的交换空间,操作系统所需的内存量,VM +程序的内存量....

所以没有确定的答案。

答案 2 :(得分:0)

理论上,您可以分配空间允许的所有内容 - 当您尝试使用时,您可能会遇到问题。

所以,答案是部分正确的:如果你有64位操作系统( JVM),你的地址空间对于整个世界来说足够大,但是数组索引是整数,a0nd是最大值Java中的整数是Integer.MAX_VALUE(2 ^ 31 - 1)。但是,对于32位操作系统来说情况并非如此,因为可用的地址空间不足以满大字节。

但是实际写入的内容受到RAM数量的限制,因此2 ^(28-3)== 2 ^ 25是你可以在内存中容纳的双打量,忽略其他所有内容。