如果我设置了最大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堆大小,我要求回答定量问题。
答案 0 :(得分:4)
您将能够创建的理论上最大的Java对象(如果您有足够大的堆)将是long[]
,其中包含2个 31 - 1个元素。那是16Gb。
但是,对于给定的堆大小,您将能够创建的最大对象取决于平台。 JVM的堆被分割为两个或更多“空格”,并且任何给定对象必须适合单个空间。一个接近整个堆大小的对象是不可能的。
空间的默认大小由内存管理器计算,我从未遇到过预测大小将会是什么的简单公式。
如果您真的想要进行定量估算,那么您最好的选择是通过实验来衡量它。编写一个简单的程序,分配连续更大的数组,直到你得到一个OOME。但请注意,您得到的答案取决于您的VM版本以及您使用的JVM命令行选项。
假设,我的应用程序只有一个类,我只创建一个对象。
您的BigSingleObj
类实际上根本没有分配大对象。 HashMap将从小开始,并且会在添加条目时自动增长。
此外,HashMap
对象实际上由许多对象组成。其中最大的是哈希数组,但HashMap
的总大小将是该数组大小的5倍或更多倍。然后你需要添加键和值占用的空间......在你的情况下,这将取决于字符串大小。
所有这些意味着最大可分配对象的大小不是您可以在大HashMap
中存储的条目的有用预测器。
答案 1 :(得分:3)
答案 2 :(得分:1)
Java堆是系统中可以拥有的对象大小的限制。 检查此链接: Does an object in java have any memory size constraints?