Instanzfelder (einschließlich Eigenschafts-Hintergrundfelder) erhalten N-Kopien für N-Objekte.
Statische Felder erhalten eine einzelne Kopie pro Klasse.
Methoden sind Bytecode-Blöcke (oder nach JIT Blöcke nativer Anweisungen), die Teil des Programms "image" oder des ausführbaren Codesegments sind. Methoden sind bereits Teil des Programmimages, da es sich auf der Festplatte befindet. Sobald das Image vom Betriebssystem (oder CLR) geladen wurde, gibt es eine einzige gemeinsam genutzte Kopie des Methodencodes.
Sie sind im Allgemeinen kein Teil der Heap- oder Laufzeitzuweisung, außer in Fällen, in denen Sie den hostfähigen Compiler verwenden können, um neue Methoden im laufenden Betrieb zu kompilieren. Methoden werden nicht wie Objekte "zugewiesen" und sie werden nicht im Verhältnis zur Objekterstellung "zugewiesen". Sie existieren lediglich als Teil des Programms, bevor ein einzelnes Objekt jemals instanziiert wird. Selbst Lambdas / Delegierte werden nicht im laufenden Betrieb zugeteilt. Der Compiler erstellt bei Bedarf Klassen, um diese anderen scheinbar dynamischen Codeobjekte zu implementieren, und sie sind auch als Teil des Bytecode-Image auf der Festplatte vorhanden.
UPDATES per Kommentare:
Der JVM-Standard hat Folgendes zu sagen:
2.5.4. Methodenbereich
Die Java Virtual Machine verfügt über einen Methodenbereich, der von allen Java Virtual Machine-Threads gemeinsam genutzt wird. Der Methodenbereich ist analog zum Speicherbereich für kompilierten Code einer herkömmlichen Sprache oder analog zum "Text" -Segment in einem Betriebssystemprozess. Es speichert Strukturen pro Klasse, wie den Laufzeitkonstantenpool, Feld- und Methodendaten sowie den Code für Methoden und Konstruktoren, einschließlich der speziellen Methoden (§2.9), die bei der Klassen- und Instanzinitialisierung und Schnittstelleninitialisierung verwendet werden.
Der Methodenbereich wird beim Start der virtuellen Maschine erstellt. Obwohl der Methodenbereich logischerweise Teil des Heaps ist, kann es bei einfachen Implementierungen vorkommen, dass weder Garbage Collect noch eine Komprimierung vorgenommen werden. Diese Version der Java Virtual Machine-Spezifikation schreibt weder den Speicherort des Methodenbereichs noch die zum Verwalten von kompiliertem Code verwendeten Richtlinien vor. Der Methodenbereich kann eine feste Größe haben oder kann erweitert werden, wie es die Berechnung erfordert, und kann verkleinert werden, wenn ein größerer Methodenbereich unnötig wird. Der Speicher für den Methodenbereich muss nicht zusammenhängend sein.
Es ist also klar, dass (1) ja die Spezifikation nicht vorschreibt, wie dies getan wird, aber (2) es ist analog zum Speicherbereich für kompilierten Code einer herkömmlichen Sprache, dh. das Textsegment. Das ist der Punkt, den ich mache.