J'ai un cours suivant
class Student{
int rollNumber;
int marks;
public void setResult(int rollNumber, int marks){
this.rollNumber=rollNumber;
this.marks=marks;
}
public void displayResult(){
System.out.println("Roll Number= "+this.rollNumber+" Marks= "+this.marks);
}
}
Maintenant, je crée deux objets de type Student comme suit
Student s1=new Student();
Student s2=new Student();
Maintenant, deux ensembles différents de mémoire sont alloués pour les champs d'instance. Maintenant, ma question est de savoir si la mémoire est allouée aux méthodes (setResult
et displayResult
) deux ou une fois?
Veuillez voir la figure suivante et pouvez-vous m'aider à dire quelle figure donne les informations correctes.
Le code des méthodes fait partie de Class
(plus concis, Class<Student>
) et il est chargé en mémoire lors du premier chargement de la classe.
Cela dit, lorsque vous exécutez une méthode, une mémoire supplémentaire est utilisée pour allouer de la mémoire aux paramètres, aux variables locales, aux résultats des expressions temporaires, aux valeurs de retour, etc. Mais cette mémoire est allouée dans la pile (la mémoire utilisée lors de la création d'une nouvelle instance est allouée dans le tas.
Selon votre question, il devrait être clair maintenant que la figure B est correcte (bien qu'elle ne reflète pas ce qui se passe lorsque vous appelez réellement la méthode).
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 Virtual possède une zone de méthode qui est partagée entre tous les threads de la machine virtuelle Java. La zone de méthode est analogue à la zone de stockage du 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é 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 de taille fixe ou peut être étendue selon les besoins par le calcul et peut être contracté si une plus grande zone de méthode 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.