Où sont les méthodes statiques et variables statiques stockées dans Java?
Par exemple:
class A {
static int i=0;
static int j;
static void method() {
//static k=0; can't use static for local variables only final is permitted
//static int L;
}
}
Où ces variables stockées en Java, en tas ou dans la pile de la mémoire? Comment sont-ils stockés?
- Eh bien, pas sur la pile, pour sûr.
- très utile lien pour comprendre la collecte des Ordures sur Oracle site Officiel: oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/...
Vous devez vous connecter pour publier un commentaire.
Méthodes statiques (en fait, toutes les méthodes) ainsi que les variables statiques sont stockées dans le
PermGen
section du tas, puisqu'ils font partie de la réflexion de données (liées à la classe de données, pas exemple).Mise à jour pour la clarification:
Noter que seules les variables et leurs valeurs techniques (primitives ou des références) sont stockés dans le PermGen space.
Si votre variable statique est une référence à un objet que l'objet lui-même est stocké dans les sections normales de la tas (jeunes/vieux génération ou d'un survivant de l'espace). Ces objets (sauf s'ils sont à l'intérieur des objets comme des classes, etc.) sont pas stockées dans PermGen space.
Exemple:
Un mot sur la collecte des ordures:
Ne pas compter sur
finalize()
comme il n'est pas garanti pour fonctionner. Il est tout à fait à la JVM de décider quand exécuter le garbage collector et ce, à recueillir, même si un objet est admissible pour la collecte des ordures.Bien sûr, vous pouvez définir une variable statique à null et donc de supprimer la référence à l'objet sur le tas, mais cela ne signifie pas que le garbage collector sera les recueillir (même si il n'y a pas plus de références).
En outre
finalize()
est exécuté qu'une seule fois, de sorte que vous devez vous assurer qu'il ne jette pas des exceptions ou autrement empêcher la collecte de l'objet. Si vous arrêter de finalisation par le biais de certains exception,finalize()
de ne pas être invoquée sur le même objet une deuxième fois.Une note finale: comment le code, les données d'exécution, etc. sont stockées dépend de la JVM qui est utilisé, c'est à dire HotSpot peut faire autrement que de JRockit et cela peut même différer entre les différentes versions de la même JVM. Le ci-dessus est basée sur HotSpot pour Java 5 et 6 (ceux-ci sont fondamentalement les mêmes) car à l'époque de répondre je dirais que la plupart des gens ont utilisé ces machines virtuelles. En raison d'importants changements dans le modèle mémoire de Java 8, les déclarations ci-dessus peut ne pas être vrai pour Java 8 HotSpot - et je n'ai pas vérifier les changements de Java 7 HotSpot, donc je deviner le ci-dessus est encore vrai pour cette version, mais je ne suis pas sûr ici.
finalize()
après (si il n'avait pas été invoqué, mais n'a pas). Comme je l'ai dit dans ma réponse, ne comptez pas sur finalize().Static methods (in fact all methods) as well as static variables are stored in the PermGen section of the heap, since they are part of the reflection data (class related data, not instance related).
Pouvez vous s'il vous plaît citer le lien officiel pour qui?Variables de classe(variables Statiques) sont stockés en tant que partie de la
Class object
associé à cette classe. Cet objet de Classe ne peut être créé que par la JVM et est stocké danspermanent generation
.Également certains ont répondu qu'il est mis dans des tas de domaine qui est appelé
Method Area.
Même cette réponse n'est pas faux. C'est juste un sujet discutable si Permgen Zone est une partie de tas ou pas. Évidemment, les perceptions diffèrent de personne à personne. À mon avis, nous fournissons des tas d'espace et de permgen space différemment dans les arguments JVM. Donc c'est une bonne hypothèse pour les traiter différemment.Une autre façon de le voir
Pools de mémoire sont créés par des gestionnaires de mémoire de la JVM en cours d'exécution. Pool de mémoire peut appartenir à l'un segment ou non de segment de mémoire.Une course constante de temps de la piscine est un par classe ou par interface moment de l'exécution de la représentation de la constant_pool tableau dans un fichier de classe. Chaque constante d'exécution de la piscine est allouée à partir de la machine virtuelle Java de la méthode de la zone et les Variables Statiques sont stockées dans cette Méthode de la Zone.
Aussi cette non-tas n'est rien, mais perm gen zone.En fait la Méthode la région fait partie de perm gen.(Référence)
Also this non-heap is nothing but perm gen area.Actually Method area is part of perm gen.
C'est une question avec une réponse simple et de longue haleine réponse.
La réponse est simple, le tas. Les Classes et toutes les données s'appliquant à des classes (pas de données d'instance) est stocké dans la Génération Permanente de la section du tas.
La réponse longue est déjà sur stack overflow:
Il y a un description détaillée de la mémoire et de la collecte des ordures dans la JVM ainsi que d'une réponse qui parle de façon plus concise à ce sujet.
Avant Java 8:
Les variables statiques ont été stockés dans la permgen space(aussi appelée la méthode de la zone).
PermGen Space est également connu comme la Méthode de la Zone
PermGen Space utilisé pour stocker les 3 choses
De Java 8,
Les variables statiques sont stockés dans le Tas lui-même.À partir de Java 8, le PermGen Space ont été supprimés et les nouvelles de l'espace nommé comme MetaSpace est mis en place, qui n'est pas la partie de Tas de plus, contrairement à la précédente Permgen Space. Méta-Espace est présent sur le natif de la mémoire (la mémoire fournie par le système d'exploitation pour une Application particulière pour sa propre utilisation), et il est maintenant seulement les magasins de la catégorie des méta-données.
Internés les cordes et les variables statiques sont déplacés dans le tas lui-même.
Pour des informations officielles consulter : JEP 122:Supprimer la Permanente Gen Espace
Il est stocké dans le tas référencé par la définition de la classe. Si vous pensez à ce sujet, il n'a rien à voir avec la pile, car il n'y a aucune portée.
En plus de l'Thomas réponse de la variable statique sont mis dans des tas de domaine, lequel est appelée la Méthode de la Zone.
Que les variables statiques sont le niveau de la classe de variables, ils vont stocker "génération permanente " de mémoire dans la mémoire.
S'il vous plaît examiner cette pour plus de détails de la JVM. En espérant que ce sera utile
les variables statiques sont stockées dans le tas