Ist die Adresse eines Objekts während seines Lebenszyklus fixiert?

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.

    
ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ 27.11.2013, 17:58
quelle

2 Antworten

5

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

Dies liegt daran, dass normalerweise Objekte in eden space zugewiesen werden. 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: Selbst wenn ein Objekt in einer Generation bleibt, wenn es in derselben Generation gespeichert wird, kann sich die Adresse ändern, da es sich beim Garbage Collector möglicherweise um den Garbage Collector bewegt hat. z.B von eden space zu überlebenden, überlebenden zu überlebenden oder sogar in die alte generation im kompakt.

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

Ich hoffe, es hilft.

BEARBEITEN

Beantworten Sie die folgende Frage:

  

wenn ich ein neues Objekt anlege und es in einer Karte ablege, wo es gespeichert wird   basierend auf hashCode (das mit dem Speicher des Objekts generiert wird   Standort gemäß Java). Jetzt hat sich die Adresse des Objekts geändert (resultierend   in einem anderen hashCode), so wie die Antwort, der Code kann nie   Holen Sie das Objekt von der Karte?

hashCodes werden in der Objektkopfzeile von JVM gespeichert. So ist es konstant. Beim Erstellen 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 von Object .

    
Trying 27.11.2013 18:01
quelle
1

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

Es gibt einige GCs (einfache Markierung und Sweep zum Beispiel), die das nicht tun; Sie können eine spezielle JVM verwenden, die diese unterstützt (z. B. ein benutzerdefiniertes Build 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.

    
creichen 27.11.2013 18:26
quelle