Question

Que se passe-t-il dans la mémoire lorsqu'une classe instancie l'objet suivant?

public class SomeObject{

    private String strSomeProperty;

    public SomeObject(String strSomeProperty){
        this.strSomeProperty = strSomeProperty;
    }
    public void setSomeProperty(String strSomeProperty){
        this.strSomeProperty = strSomeProperty;
    }
    public String getSomeProperty(){
        return this.strSomeProperty;
    }
}

Dans la classe SomeClass1 :

SomeObject so1 = new SomeObject("some property value");

Dans la classe SomeClass2 :

SomeObject so2 = new SomeObject("another property value");

Comment la mémoire est-elle allouée au nouvel objet instancié et à ses propriétés?

Était-ce utile?

La solution

Passons en revue:

SomeObject so1 = new SomeObject("some property value");

... est en réalité plus compliqué qu'il n'y paraît, car vous créez une nouvelle chaîne. Il serait peut-être plus facile de penser à:

String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.

(Pour être tout à fait précis, ils ne sont pas vraiment équivalents. Dans l'original, la 'nouvelle chaîne' est créée au moment de la compilation et fait partie de l'image .class. Vous pouvez considérer cela comme un piratage des performances.)

Ainsi, la machine virtuelle alloue d’abord de l’espace pour la chaîne. En général, vous ne connaissez pas les composants internes de l'implémentation String et ne vous en souciez pas, il vous suffit donc de vous assurer qu'un morceau de mémoire est utilisé pour représenter "une certaine valeur de propriété". En outre, vous avez de la mémoire allouée temporairement contenant une référence à la chaîne. Dans le second formulaire, il est explicitement appelé tmp ; sous sa forme originale, Java le gère sans le nommer.

Ensuite, la machine virtuelle Java alloue de l'espace pour un nouvel objet SomeObject. C'est un peu d'espace pour la comptabilité interne de Java et pour chacun des champs de l'objet. Dans ce cas, il n'y a qu'un seul champ, strSomeProperty .

N'oubliez pas que strSomeProperty est simplement une référence à une chaîne. Pour l'instant, il sera initialisé à null.

Ensuite, le constructeur est exécuté.

this.strSomeProperty = strSomeProperty;

Il ne reste plus qu'à copier la référence dans la chaîne, dans votre champ strSomeProperty .

Enfin, un espace est alloué pour la référence à l'objet so1 . Ceci est défini avec une référence à SomeObject.

so2 fonctionne exactement de la même manière.

Autres conseils

Détermination de l'utilisation de la mémoire en Java par Dr. Heinz M. Kabutz donne une réponse précise , plus un programme pour calculer l'utilisation de la mémoire. La partie pertinente:

  
      
  1. La classe occupe au moins 8 octets. Donc, si vous dites nouvel objet (); vous allouerez 8 octets sur le tas.
  2.   
  3. Chaque membre de données occupe 4 octets, à l'exception des noms long et double qui occupent 8 octets. Même si le membre de données est un octet, il occupera quand même 4 octets! De plus, la quantité de mémoire utilisée est augmentée par blocs de 8 octets. Donc, si vous avez une classe qui contient un octet, elle prendra 8 octets pour la classe et 8 octets pour les données, pour un total de 16 octets (groan!).
  4.   
  5. Les tableaux sont un peu plus intelligents. Les primitives sont placées dans des tableaux. Ainsi, si vous avez un tableau d'octets, ils en occuperont chacun un (wow!). Bien entendu, l'utilisation de la mémoire augmente encore par blocs de 8 octets.
  6.   

Comme certains l’ont souligné dans les commentaires, les chaînes sont un cas particulier, car elles peuvent être internées. Vous pouvez raisonner de la même manière à propos de l'espace occupé, mais gardez à l'esprit que ce qui ressemble à plusieurs copies de la même chaîne peut en réalité pointer vers la même référence.

Points à retenir:

  1. Lorsqu'une méthode est appelée, un cadre est créé en haut de la pile.
  2. Une fois l'exécution d'une méthode terminée, le flux de contrôle retourne à la méthode appelante et son cadre de pile correspondant est vidé.
  3. Les variables locales sont créées dans la pile.
  4. Les variables d'instance sont créées dans le segment de mémoire & amp; font partie de l'objet auquel ils appartiennent.
  5. Les variables de référence sont créées dans la pile.

Réf.: http://www.javatutorialhub.com/java-stack-heap. html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top