2016-04-25 3 views
2

Wir verwenden Reflexion für eine benutzerdefinierte Klasse Mitarbeiter als:Wie speichert JVM Metainformationen einer Klasse?

Employee e = new Employee(); 
Class c = e.getClass(); 

Wie pro meines Wissens erste JVM den Bytecode der Klasse Mitarbeiter lädt, dann auch er ein Objekt von Class.class für jede geladene Klasse erstellen (Klasse Mitarbeiter hier). Im Objekt von Class.class speichert JVM Metainformationen über die zuletzt geladene Klasse.

Meta-Informationen einer Klasse sind "Name der Methoden", "Name der Felder" usw. Klasse dieser Typen wie "Methode", "Feld" usw. sind in java.lang.reflect-Paket definiert.

Ich habe Code von Class.java gesehen. Ich habe Methoden in Class.class gefunden, die Objekte oder ein Array von Objekten dieser Typen wie "Methode", "Feld" usw. zurückgeben. Aber es gibt kein Feld in Class.class, dessen Typ "Method", "Field" etc .

Wenn meine obigen Aussagen falsch sind, bitte mich korrigieren. Wenn obige Aussagen nicht falsch sind, habe ich folgende Zweifel: 1). In welchem ​​Bereich von Class.class werden verschiedene Informationen zu einer Klasse gespeichert? 2). In welchem ​​Speicherbereich von JVM werden Objekt von Employee und Objekt von Class.class gespeichert? 3). In welchem ​​Speicherbereich von JVM werden der Bytecode von Employee und der Bytecode von Class.class gespeichert?

+0

Warum ist es Ihnen wichtig? – Holger

Antwort

5

In welchem ​​Feld von Class.class werden verschiedene Informationen über eine Klasse gespeichert?

Diese Informationen speichern off Heap in der PermGen (< Java 7) oder metaSpace (Java 8+) Sie es nicht von Java direkt sehen können.

In welchem ​​Speicherbereich von JVM Objekt von Employee und Objekt von Class.class gespeichert?

Alle Objekte werden auf dem Heap gespeichert. Kleinere Objekte werden im Eden-Raum erstellt.

In welchem ​​Speicherbereich von JVM Bytecode von Employee und Bytecode von Class.class gespeichert?

Der Byte-Code wird im PermGen/Metaspace gespeichert, wenn er überhaupt gespeichert wird. Theoretisch könnte die JVM die Klassendatei nach Bedarf erneut lesen, obwohl dies in der Praxis nicht der Fall ist.

+1

Für die Standard-Klassenladearchitektur kann die JVM die Klassendatei nicht erneut lesen, da die Laufzeitklasse über ['ClassLoader.defineClass'] erstellt wurde (https://docs.oracle.com/javase/8/docs/ api/java/lang/ClassLoader.html # defineClass-java.lang.String-Byte: A-int-int-) et al. Empfangen eines Bytearrays oder 'ByteBuffer', aber keine Informationen über die Quelle dieser Bytes ... Java 9 kann dies ändern. – Holger

+0

@Holger Ich habe diese Aussage qualifiziert. Guter Punkt. +1 –

Verwandte Themen