2010-02-10 9 views
29

Quelle est la signification de l'espace PermGen dans Java?Signification de l'espace PermGen

+0

duplication possible de [Que représente réellement PermGen?] (Http://stackoverflow.com/questions/318942/what-does-permgen-actually-stand-for) – rds

Répondre

44

L'espace PermGen est réservé aux objets à long terme - principalement des objets Class chargés par le ClassLoader. PermGen ne sera pas récupéré, sauf dans des circonstances très particulières (en particulier, lorsque le ClassLoader qui a chargé ces classes est hors de portée).

Ceci est une optimisation de la récupération de place - si les objets que nous ne pensons pas être collectés sont stockés séparément, cela compacte l'espace où les autres objets sont stockés, ce qui réduit le travail du garbage collector.

+0

Le ClassLoader auquel vous faites référence est le système chargeur de classe? Où sont stockées les classes chargées par le chargeur de classe bootstrap? –

+0

Les classes chargées par le chargeur bootstrap sont celles qui font partie intégrante du langage, comme 'String' et' Object'. Cela fait partie de la mise en œuvre native de la JVM, donc il n'y a pas de réponse standard concernant "où". – danben

+0

Fine. Alors, le permgen contiendra-t-il les classes chargées par le chargeur de classe système? –

6

La seule chose que vous avez vraiment besoin de savoir est que l'espace PermGen est séparé du tas général et non affecté par le paramètre VM -Xmx. Si vous avez une application qui charge beaucoup de définitions de classe (comme un serveur d'applications ou un IDE), vous pouvez définir la taille de l'espace PermGen en utilisant l'option de machine virtuelle -XX:MaxPermSize.

4

La génération permanente détient les méta-données décrivant les classes d'utilisateurs (classes qui ne font pas partie du langage Java).

Applications avec grande base de code peut remplir ce segment du tas qui provoquera java.lang.OutOfMemoryError: PermGen. Ceci n'est pas affecté par le paramètre -Xmx ou la quantité de mémoire que vous avez sur la machine. Pour définir une nouvelle taille initiale, utilisez -XX:PermSize=64m. Pour définir une taille maximale, utilisez -XX:MaxPermSize=128m

+0

Qu'entendez-vous par "classes qui ne font pas partie du langage Java"? Connaissez-vous des classes qui ne seraient pas stockées dans PermGen? – danben

8

Le PermGen est spécifique aux machines virtuelles ayant une récupération de place générationnelle.

Si vous utilisez, par exemple, JRockit, la « signification de PermGen » est inexistante parce JRockit n'a pas ce concept. Il était courant, il y a quelques années, de voir apparaître des erreurs bizarres "hors espace PermGen" et que personne ne savait encore à qui appartenait la faute (Tomcat + Hibernate + Sun VM utilisée pour le déclencher) pour remplacer l'un des composants (de nos jours, les problèmes sont compris, mais il y a des années, quand ils ont commencé à cultiver, il était difficile de trouver des informations à ce sujet). Vous pouvez remplacer Tomcat par Resin ou Sun VM par JRockIt, etc.

Je pense qu'il est important de souligner que PermGen ne fait pas partie des spécifications Java et seulement un détail d'implémentation de (assez) certaines machines virtuelles.