7

これはばかげた質問ですが、ここにあります。

マルチスレッドプログラムと、固有の要素の「グローバル」コレクションがあります。ConcurrentHashMapのパフォーマンスのため、同期されたSetの実装を拒否しました。MapのValue部分は実際には必要ないので、メモリ使用量の観点からJavaで最小のオブジェクトを使用したいと思いました。私はこの問題を別の方法で解決しました(マップ内で複数回参照される単一のブールオブジェクト)が、Javaで最小のオブジェクトが何であるかはまだ興味があります。私はいつもそれがブール値だと思っていましたが、それは真実ではないと思います(Java-ブールプリミティブ型-サイズプリミティブデータ型

4

5 に答える 5

5

Set<K>に裏打ちされたを必要とする場合は、たとえばConcurrentHashMapを使用する必要があります。Collections.newSetFromMap

final Set<K> set = Collections.newSetFromMap(new ConcurrentHashMap<K, Boolean>());

さて、あなたが本当に車輪の再発明をしたい、そしてメモリ使用量それほど気にかけたいのなら、私はあなたがあなたの価値として単に平野を使うことを提案しますObjectObjectJavaのすべてのオブジェクトは(ユニバーサル基本クラス)から継承するため、メモリ内のオブジェクトのサイズはプレーンのサイズ以上である必要がありますObject。ジェネリック型の引数はObjectsでなければならないため、プリミティブを使用することはできません。

編集:実際、ここで値と​​して使用する特定のオブジェクトを割り当てると、とにかく割り当てられる可能性が高い既存のオブジェクトを使用するよりも多くのメモリが必要になります。VMの初期化中に多かれ少なかれ常にObject.class割り当てられるオブジェクトへの参照を使用できます。ただし、最初のソリューションを使用することを勧めします。

于 2012-08-26T19:09:22.927 に答える
5

各関連付けの値の部分は参照として固定されているため、実際には問題ではありません。ここで値と​​して使用することもできますnullが、他の(固定された)オブジェクト参照は問題ないはずです(場合によってはもっと便利です)。私は好きですBoolean.TRUE(または同様の「よく知られている」シングルトン)。その後、次の方法でメンバーシップをテストできます

if (myMap.get(someKey) != null) { ... }

に加えて

if (myMap.containsKey(someKey)) { ... }
于 2012-08-26T19:05:43.930 に答える
2

オブジェクトのサイズは次のもので構成されます。

  • 保持するインスタンス変数のサイズ
  • 8バイトまたは16バイトのヘッダー(ホットスポットVM(32/64ビット)によって異なります)
  • パディング:そのサイズは常に8バイトの倍数になるようにパディングされます。

例(32ビットJVMを想定):

public MyBoolObject {
  boolean flag;
}

取り上げ16 bytesます:(8bytesヘッダー)+ 1byte(インスタンス変数)+ 7bytes(パディング)。
マップ値には関心がないので、それらをnullに設定できます。これは、スタック(32/64ビット)からメモリを消費4またはバイトします。8

よく知られているJavaデータ構造のコスト/要素に関するこの優れたリストを確認することもできます: http ://code.google.com/p/memory-measurer/wiki/ElementCostInDataStructures

于 2012-08-26T20:40:44.520 に答える
0

クラスはインスタンス化可能であり、Objectそのインスタンスは間違いなくJavaで最小のオブジェクトです。ただし、他の多くのオブジェクトはまったく同じフットプリントをInteger持ちBoolean、64ビットVMの例です。これは、ヒープメモリのアライメントが原因です。

于 2012-08-26T19:10:41.127 に答える
0

プリミティブデータ型はオブジェクトではありません。

Javaのすべてのオブジェクトは、スーパークラスObjectから継承する必要があるためです。その場合、Javaで考えられる最小のオブジェクトは、メンバーを持たない、定義したクラスになります。そのようなクラスはかなり役に立たないでしょう。

于 2012-08-26T19:05:36.027 に答える