Frage

Ich habe in letzter Zeit viel über Speicherzuordnungsschemata in Java zu lesen, und es gibt viele Zweifel gewesen, wie ich aus verschiedenen Quellen gelesen habe. Ich habe meine Begriffe gesammelt, und ich würde durch alle Punkte und kommentieren sie gehen fordern. Ich kam, dass die Speicherzuordnung ist JVM spezifisch zu wissen, so dass ich vorher sagen muss, dass meine Frage Sun spezifisch ist.

  1. Klassen (durch den Klassenlader geladen) geht in einem speziellen Bereich auf Heap: Permanent Generation
  2. all Informationen zu einer Klasse verwandt wie Name der Klasse, Objekt-Arrays mit der Klasse verbunden ist, interne Objekte, die von JVM (wie java / lang / Objekt) und Optimierungsinformationen gehen in den Permanent-Generation-Bereich.
  3. Alle statischen Membervariablen sind wieder auf der Permanent Generation Platz.
  4. Objekte gehen auf einem anderen Haufen: Junge Generation
  5. Es gibt nur eine Kopie jeder Methode pro Klasse sein, die Methode statisch oder nicht statisch. Diese Kopie wird in dem Permanent-Generation-Bereich setzen. Für nicht-statische Methoden werden alle Parameter und lokale Variablen gehen auf den Stapel - und immer dann, wenn ein konkreter Aufruf dieser Methode ist, dass wir einen neuen Stapel-Rahmen mit ihm verbunden bekommen. Ich bin nicht sicher, wo die lokalen Variablen einer statischen Methode sind, werden gespeichert. Sind sie auf dem Haufen der Permanent Generation? Oder einfach nur ihre Referenz in dem Permanent-Generation-Bereich gespeichert und die aktuelle Kopie ist woanders (Wo?)
  6. Ich bin auch nicht sicher, wo sich der Rückgabetyp einer Methode gespeichert bekommen.
  7. Wenn die Objekte (in der jungen Generation) muss ein statisches Element verwenden (in der Dauer Generation), werden ihnen einen Verweis auf das statische Element gegeben && sie genügend Speicherplatz gegeben werden, um den Rückgabetyp der Methode zu speichern, etc.

Vielen Dank für gehen durch diese!

War es hilfreich?

Lösung

Zuerst wird, wie sollte Ihnen jetzt klar sein, dass es nur sehr wenige Menschen, die diese Antworten aus erster Hand Wissen bestätigen. Nur sehr wenige Menschen haben sich auf den letzten HotSpot JVMs gearbeitet oder in der Tiefe untersucht benötigt, um wirklich wissen. Die meisten Menschen hier (mich eingeschlossen) beantworten auf Dinge basieren sie an anderer Stelle geschrieben gesehen haben, oder was sie geschlossen haben. In der Regel, was hier geschrieben wird, oder in verschiedenen Artikeln und Webseiten, auf andere Quellen beruhen, die oder nicht endgültig sein kann. Oft ist es vereinfacht, ungenau oder einfach falsch.

Wenn Sie endgültige Bestätigung Ihrer Antworten wollen, müssen Sie wirklich das OpenJDK Quellcode zum Download ... und tun Sie Ihre eigene Forschung durch Lesen und Verstehen des Quellcodes. Fragen zu stellen, auf SO oder Schleppen durch zufälligen Web-Artikel ist kein Ton der akademische Forschung Technik.

Having said that ...

  

1) Klassen (durch den Classloader geladen) geht in einem speziellen Bereich auf Halde. Permanent Generation

AFAIK, ja. ( Aktualisieren : s. Unten)

  

2) Alle Informationen, die sich auf eine Klasse wie Name der Klasse, Objekt-Arrays mit der Klasse verbunden sind, interne Objekte, die von JVM (wie java / lang / Objekt) und Optimierungsinformationen geht in die Permanent-Generation-Bereich.

Mehr oder weniger, ja. Ich bin mir nicht sicher, was Sie einige dieser Dinge bedeuten. Ich vermute, dass "interne Objekte, die von JVM (wie java / lang / Object)" bedeutet JVM-interne Klasse Deskriptoren.

  

3) alle statischen Membervariablen sind wieder auf der Permanent Generation Bereich gehalten.

Die Variablen selbst ja. Diese Variablen (wie alle Java-Variablen) halten wird entweder primitive Werte oder Objektreferenzen. Während jedoch die statischen Membervariablen in einem Rahmen sind, die in der Permgen Heap zugewiesen wird, können die Objekte / Arrays bezeichnet die von diesen Variablen in zugewiesen werden jeder heap.

  

4) Objekte gehen auf einem anderen Haufen: Junge Generation

Nicht unbedingt. Große Objekte können direkt in den fest angestellten Generation zugeordnet werden.

  

5) Es gibt nur eine Kopie jeder Methode pro Klasse sein, die Methode statisch oder nicht statisch. Diese Kopie wird in dem Permanent-Generation-Bereich setzen.

Unter der Annahme, dass Sie mit dem Code der Methode beziehen, dann ja AFAIK. Es mag ein wenig komplizierter sein though. Zum Beispiel, dass Code in Bytecode und / oder nativen Code Formen zu unterschiedlichen Zeiten während des Lebens des JVM existieren kann.

  

... Für nicht-statische Methoden werden alle Parameter und lokale Variablen gehen auf den Stapel - und wann immer es einen Aufruf dieser Methode konkret ist, dass wir einen neuen Stapel-Rahmen mit ihm verbunden bekommen.

Ja.

  

... Ich bin sicher nicht, wo die lokalen Variablen einer statischen Methode sind gespeichert sind. Sind sie auf dem Haufen der Permanent Generation? Oder einfach nur ihre Referenz in dem Permanent-Generation-Bereich gespeichert und die aktuelle Kopie ist woanders (Wo?)

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

  

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

Wenn Sie die Mittelwert zurückgegeben durch einen (nicht-void) Methodenaufruf, dann wird es entweder auf dem Stapel oder in einem Maschinenregister zurückgegeben. Wenn sie auf dem Stapel zurückgeführt wird, das dauert 1 oder zwei Worte, je nach Rückgabetyp.

  

7) Wenn die Objekte (in der jungen Generation) nees ein statisches Element zu verwenden (in der Dauer Generation), werden ihnen einen Verweis auf das statische Element gegeben && sie genügend Speicherplatz gegeben werden, um den Rückgabetyp der zu speichern, Methode, etc.

Das ist ungenau (oder zumindest, Sie äußern sich nicht klar).

Wenn eine Methode eine statische Member-Variable zugreift, was es wird entweder ein Grundwert oder ein Objekt Hinweis . Dies kann zu einer (vorhandenen) lokalen Variablen oder Parametern zugeordnet wird, zugeordnet zu einem (bestehenden) statisch oder nicht-statischem Elemente zuzugeordnet zu einem (bestehenden) Elemente eines zuvor zugeordneten Array oder einfach verwendet und verworfen.

  • In keinem Fall neue Speicherbedarf zu halten, entweder ein Verweis oder ein Grundwert zugeordnet werden.

  • Typischerweise ein Wort des Speichers ist alles, was benötigt wird, ein Objekt oder ein Array-Referenz zu speichern und um einen Grundwert einnimmt, typischerweise ein oder zwei Worte, auf der Hardware-Architektur abhängig.

  • In keinem Fall Platzbedarf durch den Anrufer zugewiesen werden, um einen Gegenstand / Array durch ein Verfahren zurückhalten. In Java-Objekte und Arrays verwenden Pass-by-value-Semantik immer wieder ... aber das Wert, der zurückgegeben wird, ist ein Objekt oder Array-Referenz.

UPDATE

Wie von Java 8 hat der PermGen Raum mit metaSpace ersetzt. Weitere Informationen finden Sie in folgenden Ressourcen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top