Étapes dans le processus d'allocation de mémoire pour les objets Java
Ce qui se passe 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");
La façon dont la mémoire est allouée à l'objet nouvellement instancié et ses propriétés?
OriginalL'auteur DragonBorn | 2008-11-26
Vous devez vous connecter pour publier un commentaire.
Revenons en à travers elle:
... est en fait plus compliqué qu'il n'y paraît, parce que vous êtes en train de créer une nouvelle Chaîne. Il pourrait être plus facile à penser qu':
(Pour être tout à fait exact, ce n'est pas vraiment équivalent. À l'origine, la "nouvelle Chaîne" est créé au moment de la compilation et de l'est de la partie .la classe image. Vous pouvez considérer cela comme une performance hack.)
Donc, d'abord la JVM alloue de l'espace pour la Chaîne. En général, vous ne savez pas ou se soucient de l'intérieur de la Chaîne de mise en œuvre, il suffit donc de le prendre sur la confiance qu'une partie de la mémoire est utilisée pour représenter les "certains biens de valeur". Aussi, vous avez un peu de mémoire temporairement affectés contenant une référence à la Chaîne. Dans la deuxième forme, il est explicitement appelé
tmp
; dans votre forme d'origine Java gère sans la nommer.Suivant la JVM alloue de l'espace pour une nouvelle SomeObject. C'est un peu d'espace pour Java interne de la comptabilité, et de l'espace pour chacun des champs de l'objet. Dans ce cas, il y a juste un champ,
strSomeProperty
.Garder à l'esprit que
strSomeProperty
est juste une référence à une Chaîne. Pour l'instant, ça va être initialisé à null.Prochain, le constructeur est exécuté.
Tout cela ne fait que copier le référence à la Chaîne, dans votre
strSomeProperty
champ.Enfin, l'espace est alloué pour la référence de l'objet
so1
. Cette fonction est définie par une référence à la SomeObject.so2
fonctionne exactement de la même manière.java.sun.com/docs/books/jls/third_edition/html/...
Touche 🙂 Mais je pense qu'un stage est conceptuellement encore plus compliqué que ce que j'ai décrit. Je suppose que la réponse appropriée dépend de l'intention de la question.
Un stage peut conceptuellement plus compliqué, mais il a l'avantage d'être correct.
Je vais faire une analogie avec la chimie. Dans les écoles Britanniques, des jeunes de 16 ans sont enseignés le modèle de Bohr de l'atome. Il est utile dans de nombreux cas, et il est plus simple que la vérité, qui est enseigné à des niveaux supérieurs. Je vais modifier le texte afin de clarifier si.
OriginalL'auteur
La détermination de l'Utilisation de la Mémoire en Java par le Dr M. Heinz Kabutz donne une réponse précise, plus un programme pour calculer l'utilisation de la mémoire. La partie pertinente:
Comme les gens l'ont souligné dans les commentaires, les Cordes sont un cas spécial, car ils peuvent être internés. Vous pouvez raisonner sur l'espace qu'ils prendre de la même façon, mais gardez à l'esprit que ce qui ressemble à de multiples copies de la même Chaîne peut en fait montrer la même référence.
Bon point. Je ne serais pas surpris si certaines choses que l'habitude de prendre 4 octets 8 sur une plateforme 64 bits. Cependant, le programme détermine la taille d'un objet empirique. L'exécution sur la cible VM va donner une réponse précise.
Il est également possible que les nouvelles machines virtuelles ont une approche plus efficace pour stocker les booléens, les shorts etc., ou que le comportement varie entre les plates-formes (JME pourrait être optimisée pour la mémoire), ou que la JVM change de stratégie à l'approche de tas de limites.
Comment sont des tableaux abit plus intelligent?
mise à jour
OriginalL'auteur
Points à retenir:
Ref: http://www.javatutorialhub.com/java-stack-heap.html
les variables de référence sont créés dans la pile. Référence les membres de l'instance sont créés dans le contenant d'objet, dans le tas. Rien de tout cela répond à la question.
OriginalL'auteur