3

私が持っているとします:

Class A{
   int a;
}

A obj = new A();

では、obj のサイズはどうなるでしょうか。Cのように、intサイズと同じサイズになりますか?

これを理解できれば、データベースを使用せずに大きな HashMap を RAM に保持できます。

前もって感謝します。

編集

友達、

実際に私は持っています:

HashMap<Long, List<T>> map;

class T{
   private int a;
   private int b;
   private int c;
   // constructor, getters and setters
}

また、マップのサイズが 10000000 個のキーを持つようになる可能性があり、キーごとに 100 ~ 1000 のサイズのリストが作成されます。

このマップ全体がヒープに残りますか?

編集2

約 70000 個のキーでマップをロードし、それをファイルにシリアル化したとき、ファイルは約 18 MB だったので、マップはヒープで 18 MB になりますか?

4

4 に答える 4

7

JVM に依存する場合がありますが、実際には、32 ビット JVM の場合、オブジェクト = 8-byte header + fields. ヘッダーは、ID + クラスへの参照で構成されます。

フィールド サイズは、フィールド タイプ、参照 - 8 バイト、ブール値 - 1 バイトなどによって異なります。

また、オブジェクトは 8 バイトに整列されます。つまり、A は 16 バイトかかります。最小サイズ = 8 バイト、フィールドなし。

詳細はこちらhttp://www.javamex.com/tutorials/memory/object_memory_usage.shtml

Oracle JVM を使用している場合は、sun.misc.Unsafe を使用してオブジェクト構造をバイト単位で調べることができます。

于 2012-12-27T15:45:17.587 に答える
0

64 ビット システムは 31 ビット システムとは異なります

64 ビット システムは 31 ビット システムとは異なります

于 2013-02-27T01:48:04.153 に答える
0

オブジェクトはヒープ上に作成され、参照変数はスタック上に作成されるため、C と同じサイズになることはありません。したがって、同じサイズにはなりません。

于 2012-12-27T15:43:15.560 に答える
0

プライベートメンバーのため、 Object のサイズに int のサイズを加えたサイズになります。

「データベースを使用せずに大きな HashMap を RAM に保持できます」というのは、シリアライゼーションとデシリアライゼーションという永続性を処理する必要があるだけであり、オブジェクト ストリームとしては多すぎます。

于 2012-12-27T15:43:15.753 に答える