2013-11-27 6 views
8

Ist die Adresse eines Objekts während seines Lebenszyklus konstant oder kann es sich ändern? Ich dachte nur, die Adresse eines Objekts ändert sich nie. Ist es JVM abhängig? Ich habe keine klare Spezifikation gefunden.Ist die Adresse eines Objekts während seines Lebenszyklus fixiert?

+0

Die JVM intern, weil JVM Speicher Referenzadresse in lokalen Variablen, JVM Garbage-Collectors Rolle nach Objekt und Referenzbildung spielt, die in Gebrauch Objekt ist, Unsichtbar oder Unreachable –

Antwort

5

Die Adresse eines Objekts in Java ist nicht festgelegt; es kann sich vielmehr ändern (Bedingungen unterworfen).

Dies liegt daran, normalerweise Objekte in eden Raum zugeordnet sind. Dann bewegen sie sich zum Überlebendenraum, dann auch zum alten Generationsraum, wenn sie einige Müllsammlungszyklen überlebten. Es ändert sich also. Aber wenn das Objekt in eden Raum zugeordnet ist und auch Müll gesammelt wird, indem man im selben Raum bleibt, dann wird sich die Adresse nicht ändern. Wenn das Objekt zu groß ist, um es in eden space zu reservieren, ordnet die JVM das Objekt in der alten Generation zu, und wenn es sich um eine Speicherbereinigung handelt, indem es dort bleibt, wo es zugewiesen wurde, ändert sich auch die Adresse nicht.

Noch eine Sache, die Sie wissen sollten, dass selbst wenn ein Objekt in einer Generation verbleibt, wenn es in derselben Generation gespeichert wird, die Adresse sich möglicherweise ändert, da es möglicherweise von dem Garbage Collector während der Garbage Collection verschoben wurde , z.B von eden space zu überlebenden, überlebenden zu überlebenden oder sogar in die alte generation im kompakt.

Aus den obigen Bedingungen ist ersichtlich, dass das Verschieben einer Adresse JVM-abhängig ist.

Ich hoffe, es hilft.

EDIT

Die Beantwortung der folgenden Frage:

wenn ich ein neues Objekt und speichern sie in einer Karte zu erstellen, wo es basierend auf hashCode gespeichert wird (die erzeugt wird unter Verwendung von der Speicher des Objekts Speicherort nach Java). Jetzt ändert sich die Adresse des Objekts (resultierend in einem anderen hashCode), so wie die Antwort, kann der Code nie holen Sie das Objekt aus der Karte?

hashCodes werden in der Objektkopfzeile von JVM gespeichert. So ist es konstant. Bei der Erstellung eines object wird standardmäßig 1 zugewiesen, aber wenn Sie das Objekt zum ersten Mal verwenden, wird es berechnet und in der Kopfzeile gespeichert. Es ändert sich nie während der gesamten Lebensdauer der Object.

+2

Die Antwort scheint korrekt zu sein.Ich habe nur einen Zweifel, ob ich ein neues Objekt erstelle und es in einer Map ablege, wo es auf der Basis von hashCode gespeichert wird (welches unter Verwendung des Speicherorts des Objekts gemäß Java generiert wird). Jetzt die Adresse des Objekts geändert (was zu einem anderen HashCode), so wie die Antwort, der Code kann nie das Objekt aus der Karte holen ?? – dharam

+0

@dharam bitte meine Bearbeitung sehen. – Trying

1

Nicht im Allgemeinen. Viele JVM-Garbage Collectors verschieben Objekte, und die Sprache gibt keine Garantie für den Standort des Objekts.

Es gibt einige GCs (Plain Mark & Sweep, zum Beispiel), die nicht; Sie können eine spezielle JVM verwenden, die diese unterstützt (z. B. eine benutzerdefinierte Version von Jikes RVM), wenn Sie diese Funktion benötigen.

Beachten Sie, dass jedes Objekt immer noch eine (meist eindeutige) ID enthalten kann (zumindest in den JVMs, die ich gesehen habe), teilweise um eine grundlegende Implementierung von hashcode zu unterstützen.

Verwandte Themen