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 seront-elles stockées en Java, en tas ou en mémoire de pile? Comment sont-ils stockés?
Les méthodes statiques (en fait toutes les méthodes) ainsi que les variables statiques sont stockées dans la section PermGen
du tas, car elles font partie des données de réflexion (données relatives à la classe, non liées à l'instance).
Mise à jour pour clarification:
Notez que seules les variables et leurs valeurs techniques (primitives ou références) sont stockées dans l'espace PermGen.
Si votre variable statique est une référence à un objet, cet objet est lui-même stocké dans les sections normales du segment de mémoire (jeune/ancienne génération ou espace survivant). Ces objets (sauf s’ils sont des objets internes tels que des classes, etc.) sont non stockés dans l’espace PermGen.
Exemple:
static int i = 1; //the value 1 is stored in the PermGen section
static Object o = new SomeObject(); //the reference(pointer/memory address) is stored in the PermGen section, the object itself is not.
Un mot sur le ramassage des ordures:
Faites pas comptez sur finalize()
car l'exécution n'est pas garantie. C'est à la JVM de décider quand exécuter le ramasse-miettes et ce qu'il faut collecter, même si un objet est éligible pour le ramasse-miettes.
Bien sûr, vous pouvez définir une variable statique sur null et ainsi supprimer la référence à l'objet sur le tas, mais cela ne signifie pas que le ramasse-miettes le fera la collectera (même s'il n'y a plus de références).
De plus, finalize()
est exécuté une seule fois. Vous devez donc vous assurer qu'il ne génère pas d'exceptions ou n'empêche pas l'objet d'être collecté. Si vous arrêtez la finalisation par une exception, finalize()
ne sera pas appelé une seconde fois sur le même objet.
ne note finale: la façon dont le code, les données d’exécution, etc. sont stockés dépend de la machine virtuelle utilisée, c’est-à-dire que HotSpot peut le faire différemment de JRockit et peut même différer d’une version à l’autre de la même machine virtuelle. Ce qui précède est basé sur le HotSpot pour Java 5 et 6 (ils sont fondamentalement les mêmes)] puisqu’au moment de répondre, je dirais que la plupart des gens utilisaient ces machines virtuelles. modèle de mémoire à partir de Java 8, les instructions ci-dessus risquent de ne pas être vraies pour Java 8 HotSpot - et je n'ai pas vérifié les modifications de Java 7 HotSpot, donc je suppose ce qui précède est toujours vrai pour cette version, mais je ne suis pas sûr ici.
Les variables de classe (variables statiques) sont stockées dans le fichier Class object
associé à cette classe. Cet objet de classe ne peut être créé que par la machine virtuelle Java et est stocké dans permanent generation
.
En outre, certains ont répondu qu'il est stocké dans une zone non-tas appelée Method Area.
Même cette réponse n’est pas fausse. La question de savoir si Permgen Area fait partie du tas ou non est discutable. Évidemment, les perceptions diffèrent d'une personne à l'autre. À mon avis, nous fournissons l’espace de tas et l’espace de permgen différemment dans les arguments de la machine virtuelle Java. Il est donc judicieux de les traiter différemment.
Une autre façon de le voir
Les pools de mémoire sont créés par les gestionnaires de mémoire JVM lors de l'exécution. Le pool de mémoire peut appartenir à la mémoire de tas ou à la mémoire non de tas. Un pool constant d'exécution est une représentation d'exécution par classe ou par interface de la table constant_pool dans un fichier de classe. Chaque pool constant d’exécution est alloué à partir de la zone de méthode et des variables statiques de la machine virtuelle Java sont stockées dans cette zone de méthode. Ce non-tas est également une zone permanente. La zone de méthode fait partie de perm gen. ( référence )
C'est une question avec une réponse simple et une réponse longue.
La réponse simple est le tas. Les classes et toutes les données s'appliquant aux classes (pas les données d'instance) sont stockées dans la section Génération permanente du segment de mémoire.
La réponse longue est déjà sur le dépassement de pile:
Il existe un description détaillée de la mémoire et de la récupération de place dans la machine virtuelle ainsi qu'un réponse plus concise à ce sujet.
Avant Java 8:
Les variables statiques ont été stockées dans l’espace permgen (également appelé zone de méthode).
L'espace PermGen est également connu sous le nom de zone de méthode
PermGen Space utilisé pour stocker 3 choses
À partir de Java à partir de 8
Les variables statiques sont stockées dans le tas lui-même.From Java 8 l’espace PermGen a été supprimé et un nouvel espace nommé MetaSpace est introduit qui ne fait plus partie de Heap contrairement au précédent Permgen Espace: le méta-espace est présent sur la mémoire native (mémoire fournie par le système d'exploitation à une application particulière pour son propre usage) et ne stocke plus que les méta-données de classe.
Les chaînes internes et les variables statiques sont déplacées dans le tas même.
Pour des informations officielles, voir: PEC 122: Supprimer l’espace permanent des générations
Il est stocké dans le tas référencé par la définition de classe. Si vous y réfléchissez, cela n’a rien à voir avec la pile car il n’ya pas de portée.
En plus de la réponse de Thomas, les variables statiques sont stockées dans une zone sans tas appelée Zone de méthode.
Les variables statiques étant des variables de niveau classe, elles stockeront " la génération permanente " de la mémoire heap. Veuillez regarder dans this pour plus de détails sur la JVM. En espérant que cela vous sera utile
les variables statiques sont stockées dans le tas