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 consulter la figure suivante et pouvez-vous m'aider à dire quelle figure donne les informations correctes.
java
object-oriented
memory
jvm
Harish_N
la source
la source
Réponses:
Le code des méthodes fait partie de
Class
(de manière plus conciseClass<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).
la source
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:
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.
la source
objet alloué dans la mémoire de tas.Lorsque l'objet est alloué, l'emplacement pour toute la variable d'instance est créé et détruit lorsque l'objet est détruit.Ainsi, la variable d'instance est également allouée dans la mémoire de tas.Et la variable locale est créée en pile au moment où sont appelées.
la source