Les champs d'instance (y compris les champs de support de propriété) obtiennent N-copies pour N-objets.
Les champs statiques obtiennent une seule copie par classe.
Les méthodes sont des blocs de bytecode (ou après JIT, des blocs d'instructions natives) qui font partie de "l'image" du programme ou du segment de code exécutable. Les méthodes font déjà partie de l'image du programme car elle se trouve sur le disque. Une fois que l'image est chargée par le système d'exploitation (ou CLR), il existe une seule copie partagée du code de méthode.
Ils ne font généralement pas partie du "tas" ou de l'allocation d'exécution, sauf dans les cas où vous pouvez utiliser le compilateur hébergeable pour compiler de nouvelles méthodes à la volée. Les méthodes ne sont pas "allouées" comme les objets et elles ne sont pas "allouées" par rapport à la création d'objet. Ils existent simplement dans le cadre du programme avant qu'un seul objet ne soit instancié. Même les lambdas / délégués ne sont pas attribués à la volée. Le compilateur crée des classes à la demande pour implémenter ces autres objets de code apparemment dynamiques, et ils existent également dans le cadre de l'image de bytecode sur le disque.
MISES À JOUR par commentaires:
La norme JVM a ceci à dire:
2.5.4. Zone de méthode
La machine virtuelle Java a une zone de méthode qui est partagée entre tous les threads de la machine virtuelle Java. La zone de procédé est analogue à la zone de stockage pour le code compilé d'un langage conventionnel ou analogue au segment "texte" dans un processus de système d'exploitation. Il stocke les structures par classe telles que le pool de constantes d'exécution, les données de champ et de méthode, et le code des méthodes et constructeurs, y compris les méthodes spéciales (§2.9) utilisées dans l'initialisation de classe et d'instance et l'initialisation d'interface.
La zone de méthode est créée au démarrage de la machine virtuelle. Bien que la zone de méthode fasse logiquement partie du tas, les implémentations simples peuvent choisir de ne pas effectuer de récupération de place ou de la compacter. Cette version de la spécification Java Virtual Machine ne requiert pas l'emplacement de la zone de méthode ni les politiques utilisées pour gérer le code compilé. La zone de méthode peut être d'une taille fixe ou peut être étendue selon les besoins du calcul et peut être contractée si une zone de méthode plus grande devient inutile. La mémoire de la zone de méthode n'a pas besoin d'être contiguë.
Il est donc clair que (1) oui, la spécification ne dicte pas comment cela est fait, mais (2) elle est analogue à la zone de stockage pour le code compilé d'un langage conventionnel, c'est-à-dire. le segment de texte. C'est le point que je fais valoir.