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?
Antwort
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
.
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
@dharam bitte meine Bearbeitung sehen. – Trying
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.
- 1. Lebenszyklus eines neuen Objekts ohne Bezug
- 2. Was ist der Lebenszyklus eines Java-HttpSession-Objekts?
- 3. Ändert commitedit() die Eigenschaften seines Objekts?
- 4. Beibehalten eines Ordners und seines Inhalts während eines Installationsupdates
- 5. Wie drucken Sie die Adresse eines Objekts in C++?
- 6. Wie kann ich einem UITouch während seines gesamten Lebenszyklus einen eindeutigen Schlüssel zuweisen?
- 7. Warum ändert sich die Adresse eines Objekts zwischen Methoden?
- 8. JS: Verschieben eines div außerhalb seines Elternelements
- 9. Neudefinieren eines aufrufbaren Objekts während der Laufzeit
- 10. Ändern eines Objekts während der Iteration
- 11. Was ist die Definition eines Service-Objekts?
- 12. Suchen und Entfernen eines Objekts aus Arraylist, während ich die Variablen des Objekts nicht kenne
- 13. Wie kann ich die Initialisierung eines Objekts während init() abbrechen?
- 14. Bleibt die Speicheradresse eines Objekts während seiner Lebensdauer intakt?
- 15. Lebenszyklus einer Backbone.js Ansicht während ihrer Erstellung
- 16. die Adresse eines temporären Objekt
- 17. Adresse eines Objekts in C++ und seine Mitglieder
- 18. Lebenszyklus von lokalen Java-Objekten, die während eines Methodenaufrufs erstellt wurden
- 19. Was ist der Lebenszyklus von Watch App?
- 20. Erhalte die Eigenschaft eines Objekts
- 21. erhalten die Adresse eines lua Objekt
- 22. Holen Sie sich den Typ eines Objekts, das eine Eigenschaft eines anderen Objekts ist
- 23. So drucken Sie die Adresse eines Objekts, wenn Sie die toString-Methode
- 24. Abfrage über die Adresse des Objekts, während wir ein Objekt zu einem anderen zuweisen
- 25. C# Objektverweis auf die Eigenschaft eines anderen Objekts
- 26. Rufen Sie eine JavaScript-Funktion von außerhalb seines Objekts
- 27. Sind Elementvariablen wie die Eigenschaften eines Objekts?
- 28. Abrufen eines Benutzersteuerelements zum Füllen seines Containers
- 29. Programmiere die Größe eines UIViewControllers auf der Grundlage seines Containers
- 30. So verlängern Sie den Lebenszyklus eines Aktivitätsobjekts
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 –