2016-03-22 5 views
3

最大Javaヒープサイズを-Xmx512mに設定した場合、単一のオブジェクトに可能な最大サイズは?Java最大のオブジェクトサイズ(ヒープ)

私のアプリケーションには1つのクラスしかなく、正確に1つのオブジェクトを作成しているとします。

このオブジェクトのサイズの上限はありますか?私はJVMのヒープサイズを述べたように、私は定量的な何かを答えることを要求してい

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); 
    } 
} 

注:

私のクラスには、以下のようなものになります。

+3

[このリンクの説明を入力してください](http://stackoverflow.com/questions/3618122/does-an-object-in-java-have-any-memory-size-constraints) – sandip

答えて

3

(あなたが十分な大きさのヒープを持っている場合)あなたが作成することができます理論的な最大のJavaオブジェクトは、long[] 2となります。それは16Gbです。

ただし、指定されたヒープサイズに対して作成できる最大のオブジェクトは、プラットフォームによって異なります。 JVMのヒープは、2つ以上の「スペース」に分割されており、任意のオブジェクトは単一のスペース内に収まる必要があります。ヒープ全体のサイズに近づくオブジェクトは不可能です。

スペースのデフォルトサイズはメモリマネージャーによって計算されますが、サイズの予測をする簡単な式は決して出ていません。

実際に量的な見積もりが必要な場合は、実験的に測定することをおすすめします。 OOMEを取得するまで、連続して大きな配列を割り当てる単純なプログラムを書く。しかし、あなたが得る答えは、使用しているVMのバージョンとJVMのコマンドラインオプションに依存することに注意してください。


と仮定、私のアプリケーションは、単一のクラスを持って、私は正確に単一のオブジェクトを作成しています。

BigSingleObjクラスは、実際に大きなオブジェクトを実際に割り当てていません。 HashMapは小さなものから始まり、エントリが追加されると自動的に拡大します。

さらに、HashMapオブジェクトは、実際には多くのオブジェクトで構成されています。これらのうち最大のサイズはハッシュ配列ですが、HashMapの合計サイズはその配列のサイズの5倍以上になります。そして、あなたはキーと値によって占有されるスペースを追加する必要があります...あなたの場合は文字列のサイズに依存します。

これは、割り当て可能なオブジェクトの最大サイズが、あなたの大きなサイズのHashMapに格納できるエントリの数を予測するものではないことを意味します。

+0

あなたの答えを議論する? – adranale

+0

パラ1:JLSおよびJVMS。パラ2:Javaガベージコレクションに関する様々なOracleドキュメントパラ4:HashMapのjavadoc(およびソースコード)。パラ5:典型的なJVMオブジェクト表現のソースコード+バックグラウンドの知識 –

2

これは、使用しているJREによって異なります。 x64を使用するかどうか、オブジェクトにはさらに多くのスペースが必要です。

JOL (Java Object Layout)を使用すると、オブジェクトの大きさを計算できます。

これは、どれくらいのスペースが必要かを示します。

関連する問題