1

3つのオブジェクトがそれぞれオブジェクトへの参照を持っているとしましょうx。これらの3つの参照のそれぞれは、すべてが設定されている場合でも、別のメモリワード(たとえば、32ビットまたは64ビット、合計96ビットまたは192ビット)を使用しますか?まったく同じオブジェクト?

例えば

X x = getX();
object1.x = x;
object2.x = x;
object3.x = x;

さらに、キーと値の両方としてHashMap<Character, Character>常にまったく同じオブジェクトを入力するが、同じオブジェクト参照が存在している場合でも、参照の2倍のメモリとそれ自体のメモリ量を使用しますか?毎回キーと値の両方に使用されますか?これは最初の質問と同じかもしれませんが、このケースの動作が異なるのではないかと思います。CharacterHashSet<Character>Characters

これらの各ケースで、ルートオブジェクトがstaticである場合、参照はスタックまたはヒープに格納されていますか?

4

6 に答える 6

1

基本的に、複数の参照がある場合、各参照は、それが指している場所に関係なく、別々のメモリを占有します。

于 2012-12-03T22:09:59.477 に答える
1

はい、3つの参照があるので、参照用のメモリの3倍です。

Characterオブジェクトは、参照とそのコンテンツ(たとえば、)のメモリを取得しますchar。プリミティブは、プリミティブのcharスペースのみを消費します(これは、64ビットシステムの単なる参照よりも少ないです)。キーと値と同じオブジェクトを使用している場合は、2つの参照と1つのオブジェクトを確認します。

于 2012-12-03T22:11:49.370 に答える
0

作成したコードでは、まだ消費されていない追加のメモリは消費されていません。object1.x参照、、、object2.xおよびの内容を変更しているだけですobject3.x

現在のJDKでは、aは同じサイズのHashMap<Character, Character>aと同じ量のメモリを使用します。HashSet<Character>(実際には少し少ないです。)これは、キャラクターを自分自身にマップするかどうかとは無関係です。

メソッドローカル参照変数のみがスタックに格納されます。他のすべてはヒープに格納されます。特に、オブジェクトのフィールドは(オブジェクトであるかどうかに関係staticなく)、オブジェクトの他の部分と同様に、ヒープに格納されます。

于 2012-12-03T22:09:19.113 に答える
0

参照は常に同じ量のメモリを使用します。通常、64ビットJVMでも32ビットです。同じオブジェクトを別の参照として参照しているからといって、小さくなることはありません。

参照の2倍のメモリを消費しますか

いいえ。HashSetはHashMapのラッパーであるため、同じ量のメモリを消費します。

これらの各ケースで、ルートオブジェクトが静的である場合、参照はスタックまたはヒープに格納されていますか?

静的フィールドは常にHotSpotのヒープに格納されますが、JLSで指定されていないため、異なる可能性があります。スレッドローカルであるため、スタックに配置することは意味がありません。

于 2012-12-03T22:09:44.297 に答える
0

データベーステーブルの行のようなオブジェクトを考えてみてください。2つの行が特定の列に対して同じ値を持っているかどうかは関係ありません。それでも値は特定の行に保存する必要があるため、2人のユーザーがJohnという名前を共有している場合はそうです。、あなたのテーブルは2つのジョンをホストするように成長します:)

+------------------------------+
|   ID   |        NAME         |
+--------+---------------------+
|0x76BA39|       John          |
+--------+---------------------+
|0xB4H821|       John          |
+--------+---------------------+
于 2012-12-03T22:13:00.283 に答える
0

オブジェクトx、object1、object2、およびobject3は、ヒープに1回割り当てられます。最後の3つのオブジェクトはそれぞれ、参照を介してインスタンスxを参照します。参照プロパティ以外に、これらのオブジェクトごとに追加のメモリは必要ありません(他のプロパティがない場合)。通常、各オブジェクトに消費されるスペースは、そのプロパティによって異なります。割り当てられた各オブジェクトには、jvmによってヘッダーが必要です。これには通常、マークワード、クラスメタデータ、およびインスタンスが配列の場合はその長さが含まれます(http://www.cs.princeton.edu/picasso/mats/HotspotOverview.pdfを参照)。 )。

静的に定義されたクラスプロパティは、クラスの初期化フェーズ(http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html)中に、永続的な生成(ホットスポット内)にあるクラス定義に割り当てられます。 #jvms-5.5)。

于 2012-12-03T22:18:32.043 に答える