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)
编辑:下面的答案假设问题是询问可以在问题中指定的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.
鉴于该页面上的一些问题甚至没有答案,这个答案肯定是不正确的,而其他问题写得不好,我会完全忽略该页面.