堆中Java最大的对象大小

时间:2016-03-22 12:31:35

标签: java

如果我设置了最大Java堆大小-Xmx512m,那么单个对象可能的最大大小是多少?

假设,我的应用程序只有一个类,我只创建一个对象。

该对象是否有任何近似大小限制?

我的课程类似于以下内容:

public class BigSingleObj {
    //conf will contain thousand of String.
    private Map<String, String> conf = new HashMap<String, String>();
    public String getConf(String key) {
        return conf.get(key);
    }
}

注意

正如我提到的JVM堆大小,我要求回答定量问题。

3 个答案:

答案 0 :(得分:4)

您将能够创建的理论上最大的Java对象(如果您有足够大的堆)将是long[],其中包含2个 31 - 1个元素。那是16Gb。

但是,对于给定的堆大小,您将能够创建的最大对象取决于平台。 JVM的堆被分割为两个或更多“空格”,并且任何给定对象必须适合单个空间。一个接近整个堆大小的对象是不可能的。

空间的默认大小由内存管理器计算,我从未遇到过预测大小将会是什么的简单公式。

如果您真的想要进行定量估算,那么您最好的选择是通过实验来衡量它。编写一个简单的程序,分配连续更大的数组,直到你得到一个OOME。但请注意,您得到的答案取决于您的VM版本以及您使用的JVM命令行选项。

  

假设,我的应用程序只有一个类,我只创建一个对象。

您的BigSingleObj类实际上根本没有分配大对象。 HashMap将从小开始,并且会在添加条目时自动增长。

此外,HashMap对象实际上由许多对象组成。其中最大的是哈希数组,但HashMap的总大小将是该数组大小的5倍或更多倍。然后你需要添加键和值占用的空间......在你的情况下,这将取决于字符串大小。

所有这些意味着最大可分配对象的大小不是您可以在大HashMap中存储的条目的有用预测器。

答案 1 :(得分:3)

这取决于你正在使用的JRE。是否使用x64 - 您的对象将占用更多空间。

您可以使用JOL (Java Object Layout)来计算对象的大小。

这可以让你知道需要多少空间。

答案 2 :(得分:1)

Java堆是系统中可以拥有的对象大小的限制。 检查此链接: Does an object in java have any memory size constraints?