webentwicklung-frage-antwort-db.com.de

statische Zuordnung in Java - Heap, Stack und permanente Generierung

Ich habe in letzter Zeit viel über Speicherzuweisungsschemata in Java gelesen, und es gab viele Zweifel, da ich aus verschiedenen Quellen gelesen habe. Ich habe meine Konzepte gesammelt und möchte darum bitten, alle Punkte durchzugehen und sie zu kommentieren. Ich habe erfahren, dass die Speicherzuweisung JVM-spezifisch ist, daher muss ich vorher sagen, dass meine Frage Sun-spezifisch ist.

  1. Klassen (von den Klassenladern geladen) werden in einem speziellen Bereich auf dem Haufen abgelegt: Permanente Generierung
  2. Alle Informationen zu einer Klasse wie der Name der Klasse, die der Klasse zugeordneten Object-Arrays, die von JVM verwendeten internen Objekte (wie Java/lang/Object) und die Optimierungsinformationen werden in den Bereich Permanente Generierung übernommen.
  3. Alle statischen Elementvariablen werden wieder im Bereich Permanente Generierung gespeichert.
  4. Objekte gehen auf einen anderen Haufen: Junge Generation
  5. Es gibt nur eine Kopie jeder Methode pro Klasse, ob die Methode statisch oder nicht statisch ist. Diese Kopie wird in den Bereich Permanent Generation gestellt. Bei nicht statischen Methoden werden alle Parameter und lokalen Variablen in den Stapel geschrieben. Wenn diese Methode konkret aufgerufen wird, wird ein neuer Stapelrahmen zugeordnet. Ich bin nicht sicher, wo die lokalen Variablen einer statischen Methode gespeichert sind. Sind sie auf dem Haufen der permanenten Generation? Oder nur ihre Referenz wird im Bereich Permanente Generierung gespeichert, und die tatsächliche Kopie befindet sich an einer anderen Stelle (Wo?).
  6. Ich bin mir auch nicht sicher, wo der Rückgabetyp einer Methode gespeichert wird.
  7. Wenn die Objekte (in der jungen Generation) ein statisches Element (in der permanenten Generation) verwenden müssen, erhalten sie einen Verweis auf das statische Element und ausreichend Speicherplatz zum Speichern des Rückgabetyps der Methode usw.

Danke, dass du das durchgemacht hast!

110
Jaguar

Zunächst sollte Ihnen klar sein, dass es nur sehr wenige Menschen gibt, die diese Antworten aus erster Hand bestätigen können. Nur sehr wenige Leute haben an den neuesten HotSpot-JVMs gearbeitet oder sie bis zu der Tiefe untersucht, die erforderlich ist, um wirklich zu wissen. Die meisten Leute hier (ich eingeschlossen) antworten auf der Grundlage von Dingen, die sie woanders geschrieben oder gefolgert haben. Normalerweise basiert das, was hier oder in verschiedenen Artikeln und Webseiten geschrieben wird, auf anderen Quellen, die möglicherweise endgültig sind oder nicht. Oft ist es vereinfacht, ungenau oder einfach falsch.

Wenn Sie eine endgültige Bestätigung Ihrer Antworten wünschen, müssen Sie den OpenJDK-Quellcode unbedingt herunterladen ... und Recherchieren Sie selbst indem Sie den Quellcode lesen und verstehen. Das Stellen von Fragen zu SO oder das Durchsuchen von zufälligen Webartikeln ist keine solide akademische Forschungstechnik.

Davon abgesehen ...

1) Klassen (geladen von den Klassenladern) werden in einem speziellen Bereich auf dem Haufen abgelegt: Permanente Erzeugung.

AFAIK, ja. ( Update : siehe unten.)

2) Alle Informationen, die sich auf eine Klasse beziehen, wie der Name der Klasse, der Klasse zugeordnete Objektarrays, von JVM verwendete interne Objekte (wie Java/lang/Object) und Optimierungsinformationen, gehen in den Bereich Permanente Generierung.

Mehr oder weniger, ja. Ich bin nicht sicher, was Sie mit einigen dieser Dinge meinen. Ich vermute, dass "von JVM verwendete interne Objekte (wie Java/lang/Object)" JVM-interne Klassendeskriptoren bedeuten.

3) Alle statischen Elementvariablen werden wieder im Bereich Permanente Generierung gespeichert.

Die Variablen selbst ja. Diese Variablen (wie alle Java Variablen)) enthalten entweder Grundwerte oder Objektreferenzen. Während sich die statischen Elementvariablen in einem Frame befinden, der im Permgen-Heap zugeordnet ist, werden die Objekte/Arrays referenziert to by Diese Variablen können in any heap zugewiesen werden.

4) Objekte gehen auf einen anderen Haufen: Junge Generation

Nicht unbedingt. Große Objekte dürfen werden direkt der Tenured Generation zugeordnet.

5) Es gibt nur eine Kopie jeder Methode pro Klasse, ob die Methode statisch oder nicht statisch ist. Diese Kopie wird in den Bereich Permanent Generation gestellt.

Angenommen, Sie beziehen sich auf den Code der Methode, dann AFAIK yes. Es kann jedoch etwas komplizierter sein. Zum Beispiel kann dieser Code in Bytecode- und/oder systemeigenen Code-Formularen zu verschiedenen Zeitpunkten während der Lebensdauer der JVM vorhanden sein.

... Bei nicht statischen Methoden werden alle Parameter und lokalen Variablen in den Stapel geschrieben - und wenn diese Methode konkret aufgerufen wird, wird ein neuer Stapelrahmen zugeordnet.

Ja.

... Ich bin mir nicht sicher, wo die lokalen Variablen einer statischen Methode abgelegt sind. Sind sie auf dem Haufen der permanenten Generation? Oder nur ihre Referenz wird im Bereich Permanente Generierung gespeichert, und die tatsächliche Kopie befindet sich an einer anderen Stelle (Wo?).

Nein. Sie werden wie lokale Variablen in nicht statischen Methoden auf dem Stapel gespeichert.

6) Ich bin mir auch nicht sicher, wo der Rückgabetyp einer Methode gespeichert wird.

Wenn Sie den von einem (nicht ungültigen) Methodenaufruf zurückgegebenen Wert value meinen, wird er entweder auf dem Stapel oder in einem Maschinenregister zurückgegeben. Wenn es auf dem Stapel zurückgegeben wird, dauert dies je nach Rückgabetyp ein oder zwei Wörter.

7) Wenn die Objekte (in der jungen Generation) ein statisches Element (in der permanenten Generation) verwenden müssen, wird ihnen ein Verweis auf das statische Element zugewiesen und ihnen wird genügend Speicherplatz zum Speichern des Rückgabetyps der Methode usw .

Das ist ungenau (oder du drückst dich zumindest nicht klar aus).

Wenn eine Methode auf eine statische Elementvariable zugreift, wird entweder ein Grundwert oder eine Objektreferenz abgerufen. Dies kann einer (vorhandenen) lokalen Variablen oder einem Parameter zugewiesen, einem (vorhandenen) statischen oder nicht statischen Element zugewiesen, einem (vorhandenen) Element eines zuvor zugewiesenen Arrays zugewiesen oder einfach verwendet und verworfen werden.

  • In keinem Fall muss neu Speicher zugewiesen werden, um entweder einen Referenzwert oder einen primitiven Wert zu speichern.

  • In der Regel ist ein Speicherwort alles, was zum Speichern einer Objekt- oder Arrayreferenz erforderlich ist, und ein Grundwert belegt in Abhängigkeit von der Hardwarearchitektur in der Regel ein oder zwei Wörter.

  • In keinem Fall muss der Aufrufer Speicherplatz zuweisen, um ein von einer Methode zurückgegebenes Objekt/Array aufzunehmen. In Java werden Objekte und Arrays immer mit der Semantik der Übergabe von Werten zurückgegeben. Der zurückgegebene Wert ist jedoch eine Objekt- oder Arrayreferenz.

[~ # ~] Update [~ # ~]

Ab Java 8 wurde der PermGen-Bereich durch Metaspace ersetzt. Weitere Informationen finden Sie in den folgenden Ressourcen:

142
Stephen C