I campi di istanza (compresi i campi di proprietà) ottengono N copie per N oggetti.
I campi statici ottengono una singola copia per classe.
I metodi sono blocchi di bytecode (o dopo JIT, blocchi di istruzioni native) che fanno parte del programma "immagine" o segmento di codice eseguibile. I metodi sono già parte dell'immagine del programma mentre si trova sul disco. Una volta che l'immagine viene caricata dal sistema operativo (o CLR), c'è una singola copia condivisa del codice del metodo.
Non fanno parte di "heap" o allocazione di runtime in generale, tranne nei casi in cui è possibile utilizzare il compilatore hostable per compilare nuovi metodi al volo. I metodi non vengono "allocati" come oggetti e non sono "allocati" rispetto alla creazione dell'oggetto. Esse semplicemente come parte del programma prima che un singolo oggetto sia mai istanziato. Anche i lambda / i delegati non sono assegnati al volo. Il compilatore crea classi on-demand per implementare questi altri oggetti di codice apparentemente dinamici e esistono anche come parte dell'immagine bytecode sul disco.
AGGIORNAMENTI per commenti:
Lo standard JVM ha questo da dire:
2.5.4. Method Area
The Java Virtual Machine has a method area that is shared among all
Java Virtual Machine threads. The method area is analogous to the
storage area for compiled code of a conventional language or analogous
to the "text" segment in an operating system process. It stores
per-class structures such as the run-time constant pool, field and
method data, and the code for methods and constructors, including the
special methods (§2.9) used in class and instance initialization and
interface initialization.
The method area is created on virtual machine start-up. Although the
method area is logically part of the heap, simple implementations may
choose not to either garbage collect or compact it. This version of
the Java Virtual Machine specification does not mandate the location
of the method area or the policies used to manage compiled code. The
method area may be of a fixed size or may be expanded as required by
the computation and may be contracted if a larger method area becomes
unnecessary. The memory for the method area does not need to be
contiguous.
Quindi è chiaro che (1) sì le specifiche non dettano come ciò viene fatto, ma (2) è analogo all'area di memoria per il codice compilato di un linguaggio convenzionale, es. il segmento di testo. Questo è il punto che sto facendo.