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

Pac*_*ier 0 java memory

Code Ranch有这个问题:

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

Ans: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];
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

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

所以要么问题不好,要么答案是错误的 - 或者两者都可能.


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

(double顺便说一句,这不是使用64位的"大多数实现" 的问题 - 它是规范所要求的.)

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

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

  • @LinusKleen:我不确定你要做的是什么,但是我读这个问题的方式是,如果阵列可用的所有内存都是256MB,那就是你可以分配的最大数组大小.这绝对是一个措辞不好的问题 - 不幸的是,它与页面的其余部分一致. (3认同)
  • 交换空间很少位于RAM中. (2认同)