Les méthodes statiques (en fait toutes les méthodes) ainsi que les variables statiques sont stockées dans la PermGen
section du tas, puisqu'elles font partie des données de réflexion (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 objet, cet objet lui-même est stocké dans les sections normales du tas (génération jeune / ancienne ou espace survivant). Ces objets (sauf s'ils sont des objets internes comme 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 pasfinalize()
car il n'est pas garanti de fonctionner. Il appartient totalement à 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 nulle et donc la retirer référence à l'objet sur le tas , mais cela ne signifie pas que le collecteur des ordures va recueillir (même s'il n'y a plus de références).
De plus, il finalize()
n'est exécuté qu'une seule fois, vous devez donc vous assurer qu'il ne lève pas d'exceptions ou n'empêche pas la collecte de l'objet. Si vous arrêtez la finalisation via une exception, finalize()
il ne sera pas appelé une seconde fois sur le même objet.
Une dernière remarque : la façon dont le code, les données d'exécution, etc. sont stockés dépend de la JVM utilisée, c'est-à-dire que HotSpot peut le faire différemment de JRockit et cela peut même différer entre les versions de la même JVM. Ce qui précède est basé sur HotSpot pour Java 5 et 6 (ce sont essentiellement 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 déclarations ci-dessus peuvent ne pas être vraies pour Java 8 HotSpot - et je n'ai pas vérifié les modifications de Java 7 HotSpot, donc je suppose que ce qui précède est toujours vrai pour cette version, mais je ne suis pas sûr ici.