La variable statique est allouée pour toute la durée de l'exécution du programme, donc ni pile, ni tas ne lui conviennent. Alors où est-ce? Il devrait y avoir un endroit où il est chargé?
Les champs statiques sont initialisés lorsqu'une classe est chargée et sont ignorés lorsque le chargeur de classes de cette classe est déchargé. Ils peuvent être nettoyés, voire dupliqués dans un autre chargeur de classe.
Pour les applications telles que celles-ci, qui utilisent OSGi, les variables statiques ne sont pas vivantes et peuvent être rechargées plusieurs fois.
La manière dont cela est implémenté peut dépendre de la machine virtuelle Java, mais la machine virtuelle Java/Sun crée un "objet" destiné à contenir les champs statiques d'une classe. Cet objet est accessible via la classe Unsafe, qui peut également être utilisé pour examiner ces champs "objets".
Nous avons 3 segments dans notre mémoire:
Segment de pile - contient les variables locales et les variables de référence (variables qui contiennent l'adresse d'un objet dans le tas).
Segment de segment de mémoire - contient tous les objets créés au moment de l'exécution, uniquement les objets, ainsi que leurs attributs d'objet (variables d'instance).
Segment de code - le segment où se trouvent les bytecodes Java compilés lors de leur chargement. Les membres statiques (variables ou méthodes) sont appelés membres de classe, ce qui signifie qu'ils résident à l'emplacement de la classe (code intermédiaire), qui se trouve dans le segment de code.
La variable statique est allouée pour toute la durée de l'exécution du programme. Par conséquent, ni pile ni tas ne lui conviennent.
En fait, des cadres statiques (c’est-à-dire les cadres contenant les variables statiques) sont alloués à partir du tas.
Et ils n'existent pas nécessairement pendant la durée d'exécution d'un programme. Par exemple, les cadres statiques pour les classes chargées dynamiquement peuvent être mis au rebut si le chargeur de classes parent, toutes les classes et toutes les instances deviennent inaccessibles.
Sur les cinq zones de mémoire utilisées par JVM, les champs statiques se voient allouer de la mémoire. dans la zone de classe (partie de PremGen) lorsque la classe est chargée par le chargeur de classes de l'application au cours des phases de préparation et de chargement . Si le champ est primitif, la valeur est stockée dans la zone de classe et, s'il s'agit d'un type d'objet (nouvel opérateur utilisé), elle est stockée dans tas mais la référence est donnée à la variable de champ statique assignée dans la zone de classe. Lorsque la classe est déchargée, la mémoire de ce champ statique peut également être récupérée par GC.
Si le champ est également final, c'est-à-dire final statique, il est maintenu dans un pool constant sous l'aire de la classe.
De http://www.daniweb.com/software-development/Java/threads/34695 :
La mémoire de la variable statique est allouée au début du programme, en mémoire normale, au lieu de la pile (mémoire réservée spécifiquement pour le programme ). l'avantage de ceci est que cela rend votre variable ou procédure totalement constante, et vous ne peut pas changer accidentellement la valeur . L'inconvénient est que le la mémoire n'est pas désallouée avant le le programme est terminé. Je n'ai jamais entendu tout ce que les valeurs statiques prennent plus de mémoire que si elles sont déclaré régulièrement, mais leur mémoire utilisation est constante à travers.