2009-11-11 4 views
1

Hé les gars, je suis passé en revue quelques questions, mais je ne peux pas vraiment comprendre, j'ai regardé le livre de texte, mais je ne sais pas où je peux trouver réponse ...java et mise en page de mémoire

Je sais que ce serait très difficile de faire des diagrammes de mémoire sans photos, mais s'il vous plaît gardez avec moi.

interface Lovable 
    public void love(); 

class Foo implements Lovable 
    public void love(); 
     // something 
    public int val() 
     // return something1 

public class Love 
    public static void main(String args []) 
     Foo foo = new Foo() 
     foo.love() 
     foo.love() 
     int bar = =foo.val() 
     System.out.print(v) 

Maintenant, je vois que foo est déclarée avec new, donc je sais l'information réelle de la classe Foo est stockée dans tas et il y a un cadre? Pointeur? qui pointe vers cet espace de mémoire dans le tas sur le dessus de la pile (avant que foo n'appelle des méthodes). Alors, qu'en est-il de l'interface? cela serait-il stocké dans le tas aussi? Donc sur le bas de la pile serait la classe Love (contient aussi int bar), un pointeur qui pointe vers Foo foo in heap, un cadre pour foo.love(), un autre frame foo.love(), un fram pour foo.val(), un cadre pour imprimer?

Ai-je l'idée? ou suis-je vraiment très loin? Si vous savez où je peux obtenir plus d'informations, s'il vous plaît faites le moi savoir. J'apprécie toute entrée ..

Répondre

4

Généralement, les objets sont stockés sur le heap géré par le garbage collector.

Seul le latest release of Java 6 a une analyse d'échappement pour stocker des objets sur la pile s'ils n'échappent pas. Les informations de classe sont stockées dans perm space.

0

foo la référence est sur la pile. L'objet pointé par foo est sur le tas (il peut en fait être optimisé sur la pile dans les cas simples, mais conceptuellement il est sur le tas).

La classe de l'objet peut avoir des superclasses et implémenter des interfaces. Cependant, quelle que soit la classe dans laquelle un champ est déclaré, les champs d'instances sont tous conservés dans la même allocation de mémoire sur le tas.

+0

Une très belle photo! –

+0

C'est très étrange ... – Skilldrick

+0

Oh, oui, il a 3 bras. –

1

La mise en page de la mémoire dépend de la JVM et les JVM ont beaucoup de latitude sur l'utilisation de la mémoire tant qu'ils maintiennent la vue logique du modèle d'objet Java que le programmeur pense. La JVM Sun a plusieurs "tas" car elle implémente la récupération de place générationnelle. Les objets sont créés dans l'espace eden, qui est traité comme une pile de sorte que les objets peuvent être créés très rapidement. S'ils vivent assez longtemps, les objets sont déplacés vers des générations plus longues, et ceux-ci sont implémentés plus comme des tas alloués dynamiquement. La JVM stocke les classes et les chaînes internées dans le tas "permspace". Permspace n'est pas permanent: les classes sont collectées lorsqu'il n'y a plus de références à leurs instances ou classloader. Et, comme indiqué ci-dessus, Java 6 allouera un objet sur la pile d'appels s'il peut déterminer que les références à l'objet ne quittent pas le bloc.