2016-03-22 122 views
3

如果我設置最大Java堆大小-Xmx512m,那麼單個對象的可能最大大小是多少?堆中Java最大對象大小

假設,我的應用程序只有一個類,我創建了一個單一的對象。

該對象是否有任何近似大小限制?

我的類看起來像下面這樣:

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

檢查此鏈接:[輸入鏈接描述](http://stackoverflow.com/questions/3618122/does-an-object-in-java-have-any-memory-size-constraints) – sandip

回答

3

理論最大的Java對象,你將能夠創建(如果你有足夠大的堆)將是一個 - 1個元素。那是16Gb。

但是,您將能夠爲給定的堆大小創建的最大對象是平臺相關的。 JVM的堆被分割成兩個或多個「空間」,並且任何給定的對象都必須適合單個空間。接近整個堆大小的對象是不可能的。

這些空格的默認大小是由內存管理器計算出來的,我從來沒有遇到過一個預測大小將會是什麼的簡單公式。

如果你真的想要一個定量的估計,那麼你最好的選擇是通過實驗來衡量它。編寫一個簡單的程序,分配連續更大的數組,直到獲得OOME。但請注意,您得到的答案取決於您的VM版本以及您使用的JVM命令行選項。


想,我的應用程序只有一個班,我正好創造一個單一的對象。

您的BigSingleObj類實際上並未實際分配大對象。 HashMap將從小開始,並且會隨着條目添加到其中而自動增長。而且,HashMap對象實際上由多個對象組成。其中最大的將是散列數組,但總數的HashMap將是該數組的5倍或更多倍。然後你需要添加鍵和值所佔用的空間......在你的情況下,將取決於字符串的大小。

所有這一切意味着最大的可分配對象的大小並不能預測您可以在大型HashMap中存儲多少條目。

+0

任何來源爭辯你的答案? – adranale

+0

第1段:JLS和JVMS。第2段:關於Java垃圾回收的各種Oracle文檔。 Para 4:HashMap的javadoc(和源代碼)。第5段:典型JVM對象表示的源代碼+背景知識。 –

2

這取決於你正在使用的JRE。你是否會使用x64 - 你的物體需要更多的空間。

您可以使用JOL (Java Object Layout)來計算您的對象有多大。

這可以讓你知道需要多少空間。