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

标签 java memory

Code Ranch有这个问题:

28) If we have 256 MB RAM then what is the maximum length of double array we can create? (Ignore the jvm memory occupied and everything else)

Ans: Integer.MAX_VALUE as the length() method must return correct 'int' length.

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

那么在 256 MB RAM 环境中, double 组的最大长度怎么会是 2147483647 呢?

下面的测试代码肯定会给我们带来 OOM,对吧?:

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

最佳答案

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

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

<小时/>

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

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

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

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

关于java - 使用 256 MB RAM,我们可以创建的 double 组的最大长度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624400/

相关文章:

java - 有推荐的支持 Socks 代理的 Java IRC 客户端库吗?

java - java 如何在 32 位架构中处理 long 和 double

memory - 查找每个redis DB的内存消耗

c++ - c++ vector中对象的指针问题

sql-server - 强制 SQL Server 将整个数据库预缓存到内存中

ios - 内存泄漏 - NSData 和 NSMutableString

java - 私有(private)方法的最大参数数量

java - 将卡片 View 转换为图像(位图)

java - 使用@EnableAuthorizationServer 时如何在 HTTP BasicAuthenticationFilter 之后添加过滤器

python - 在 Python 中重用名称以节省内存