2013-11-27 7 views
8

オブジェクトのアドレスは、ライフサイクルの間一定であるか、または変更することができますか?私はちょうどオブジェクトのアドレスが決して変化しないと思った。それはJVMに依存していますか?私は明確な仕様を見つけていない。オブジェクトのライフサイクル中にアドレスが固定されていますか?

+0

そのJVMの内部に、ローカル変数でJVMストアの参照アドレス、JVMのガベージコレクタは、オブジェクト参照の作成後に役割を果たしているため、オブジェクトの使用であり、目に見えない または –

答えて

5

java内のオブジェクトのアドレスは固定されていません。むしろ、それは変化し得る(条件に従う)。

通常はオブジェクトがエデンスペースに割り当てられているためです。その後、生存者空間に移動し、次にガベージコレクションのサイクルを経ても旧世代の空間に移動します。それは変化します。しかしオブジェクトがエデンスペースに割り当てられ、同じスペースにとどまってガベージコレクトされても、アドレスは変更されません。同様に、オブジェクトが大きすぎてeden空間に割り当てられない場合、JVMはオブジェクトを古い世代に割り当て、割り当てられた場所にとどまることによってガーベージ・コレクションが行われると、アドレスも変更されません。

1つのオブジェクトが世代にとどまっていても、同じ世代にとどまってガベージコレクションされている場合は、ガベージコレクション中にガベージコレクタによって移動された可能性があるため、 、例えばエデンスペースから生存者、生存者から生存者、さらにはコンパクト化の場合には旧世代にまで及ぶ。

上記の条件から、アドレスの移動はJVMに依存することが明らかです。

希望します。

EDIT

以下の質問に答える:私は新しいオブジェクトを作成し、それを使用して生成されるのhashCode(に基づいて を格納しているマップ、それを格納する場合

をオブジェクトごとのメモリ )。今度はオブジェクトのアドレスが変更され(結果として が別のhashCodeになります)、回答ごとにコードは決して のオブジェクトをマップから取得できませんか?

hashCodesは、JVMによってオブジェクトヘッダーに保存されます。それは一定です。 objectを作成している間は、デフォルトで1に割り当てられていますが、初めてオブジェクトを使用すると計算され、ヘッダーに格納されます。 Objectの人生を通して決して変化しません。

+2

到達不能答えが正解のようです。新しいオブジェクトを作成してマップに格納すると、hashCode(Javaのオブジェクトのメモリ位置を使用して生成されます)に基づいて格納されます。 これで、オブジェクトのアドレスが変更され(結果として異なるhashCodeになりました)、答えごとに、コードは決してマップからオブジェクトをフェッチできませんか? – dharam

+0

@dharam私の編集をご覧ください。 – Trying

1

一般的ではありません。多くのJVMガベージコレクタはオブジェクトを移動させ、オブジェクトの場所を保証しません。

いくつかのGC(平らなマーク&掃引など)がありません。この機能が必要な場合は、これらをサポートする特殊なJVM(カスタムビルドJikes RVMなど)を使用できます。

各オブジェクトには(少なくとも私が見たJVMでは)一意のID(ほとんど)が含まれていることがあり、部分的にhashcodeの基本的な実装をサポートすることに注意してください。

関連する問題