Où sont les méthodes statiques et les variables statiques stockées en 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 seront-elles stockées en Java, en tas ou en mémoire de stack? 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 reflection (données liées à 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 object, cet object lui-même est stocké dans les sections normales du tas (génération ancienne / ancienne ou espace de survie). Ces objects (sauf s’il s’agit d’objects internes tels que des classes, etc.) ne sont pas 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:

Ne vous fiez pas à finalize() car son 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 object est admissible à la récupération de place.

Bien sûr, vous pouvez définir une variable statique sur null et ainsi supprimer la référence à l’object sur le tas, mais cela ne signifie pas que le ramasse-miettes le 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 jette pas d’exceptions ou ne pas empêcher l’object d’être collecté. Si vous arrêtez la finalisation par une exception, finalize() ne sera pas invoqué sur le même object une seconde fois.

Une dernière remarque : la manière dont le code, les données d’exécution, etc. sont stockées dépend de la JVM utilisée, c’est-à-dire que HotSpot peut le faire différemment de JRockit et que cela peut même varier entre les versions de la même JVM. Ce qui précède est basé sur HotSpot pour Java 5 et 6 (ceux-ci sont fondamentalement les mêmes), car au moment de répondre, je dirais que la plupart des gens utilisaient ces JVM. En raison de changements majeurs dans le modèle de mémoire à partir de Java 8, les instructions ci-dessus peuvent ne pas être vraies pour Java 8 HotSpot – et je n’ai pas vérifié les modifications de Java 7 HotSpot. mais je ne suis pas sûr ici.

Les variables de classe (variables statiques) sont stockées dans le cadre de l’ Class object associé à cette classe. Cet object de classe ne peut être créé que par JVM et est stocké dans permanent generation .

Certains ont également répondu qu’il était stocké dans une zone non-tas appelée Method Area. Même cette réponse n’est pas erronée. C’est juste un sujet discutable si la région de Permgen fait partie du tas ou non. De toute évidence, les perceptions diffèrent d’une personne à l’autre. À mon avis, nous fournissons un espace de tas et un espace de permgen différemment dans les arguments JVM. C’est donc une bonne hypothèse 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 à une mémoire de segment de mémoire ou à une mémoire non-tas. Un pool de constante d’exécution est une représentation de la table constant_pool dans un fichier de classe, par classe ou par interface. Chaque pool de constante d’exécution est alloué à partir de la zone de méthode de la machine virtuelle Java et les variables statiques sont stockées dans cette zone de méthode. En outre, ce non-tas n’est rien d’autre que la zone de génération. En fait, la zone Méthode fait partie de la génération permanente ( référence ).

entrer la description de l'image ici

Ceci 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 tas.

La longue réponse est déjà sur le débordement de stack:

Il existe une description détaillée de la mémoire et de la récupération de la mémoire dans la machine virtuelle Java , ainsi qu’une réponse plus concise à ce sujet.

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 stack car il n’y a pas de scope.

En plus de la réponse de Thomas, la variable statique est stockée dans une zone non-tas appelée Zone de méthode.

les variables statiques sont stockées dans le tas

Les variables statiques étant des variables de niveau classe, elles stockeront la ” génération permanente ” de la mémoire de tas. Veuillez regarder ceci pour plus de détails sur JVM. En espérant que cela sera utile

Avant Java 8:

Les variables statiques étaient stockées dans l’espace permgen (également appelé zone de méthode).

PermGen Space est également connu sous le nom de Method Area

PermGen Espace utilisé pour stocker 3 choses

  1. Données de niveau classe (métadonnées)
  2. cordes internes
  3. variables statiques

A partir de Java 8

Les variables statiques sont stockées dans le Heap lui-même. À partir de 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 Space. Le méta-espace est présent dans la mémoire native (mémoire fournie par le système d’exploitation à une application particulière pour son propre usage) et il ne stocke plus que les métadonnées de classe.

Les chaînes internes et les variables statiques sont déplacées dans le tas lui-même.

Pour des informations officielles se référer à: JEP 122: Enlever l’espace générique permanent