Qu'est-ce que l'espace permanent?

88

Tout en apprenant le profilage de la mémoire Java, je continue à voir le terme «espace perm» en plus de «tas». Je sais ce qu'est le tas - quel est l'espace permanent?

sauter
la source
13
Java 8 a complètement supprimé ce concept et est passé à Metaspace
pramodc84
2
Référence bien expliquée ici youtube.com/watch?v=PUUJ4rNpRhU
shareef

Réponses:

103

Il signifie génération permanente :

La génération permanente est spéciale car elle contient des méta-données décrivant les classes d'utilisateurs (classes qui ne font pas partie du langage Java). Des exemples de telles méta-données sont des objets décrivant des classes et des méthodes et ils sont stockés dans la génération permanente. Les applications avec une grande base de code peuvent rapidement remplir ce segment du tas, ce qui entraînera java.lang.OutOfMemoryError: PermGen quelle que soit la hauteur de votre -Xmx et la quantité de mémoire dont vous disposez sur la machine.

Andrew Hare
la source
Andrew, je suis juste curieux de savoir quelle pourrait être la taille de PerGen?
gks
Juste curieux de savoir si permgen fait partie de la mémoire de tas (comme indiqué dans cette réponse) ou il est hors tas (comme indiqué dans cette réponse - stackoverflow.com/a/31103100/3061686 ).
akki
25

Perm spaceest utilisé pour conserver les informations des classes chargées et quelques autres fonctionnalités avancées comme String Pool(pour les tests d'égalité de chaîne hautement optimisés), qui sont généralement créées par des String.intern()méthodes. Au fur et à mesure que votre application (nombre de classes) augmentera, cet espace se remplira rapidement, puisque le ramasse-miettes sur cet espace n'est pas très efficace pour nettoyer si nécessaire, vous obtenez rapidement Out of Memory: erreur d'espace perm gen. Après cela, aucune application ne fonctionnera efficacement sur cette machine, même après avoir une énorme machine virtuelle Java vide.

Avant de démarrer votre application, vous devez java -XX:MaxPermSizevous débarrasser de cette erreur.

DKSRathore
la source
Le pool de chaînes est déplacé vers l'espace du tas depuis java 7.
Caffeine Coder
20

Réponse simple (et simplifiée à l'extrême): c'est là que la jvm stocke ses propres données comptables, par opposition à vos données.

Mat
la source
17

Perm Gen signifie génération permanente qui contient les informations de méta-données sur les classes.

  1. Supposons que si vous créez un nom de classe A, sa variable d'instance sera stockée dans la mémoire du tas et la classe A avec les chargeurs de classe statiques sera stockée dans la génération permanente.
  2. Les garbage collector auront du mal à effacer ou à libérer l'espace mémoire stocké dans la mémoire de génération permanente. Par conséquent, il est toujours recommandé de conserver les paramètres de mémoire permgen à la limite souhaitable.
  3. JAVA8 a introduit le concept appelé génération de méta-espace, par conséquent permgen n'est plus nécessaire lorsque vous utilisez les versions de jdk 1.8.
Praveen Kumar KS
la source
5

L'espace permgen est la zone du tas qui contient toutes les données réfléchissantes de la machine virtuelle elle-même, telles que les objets de classe et de méthode.

Jesse
la source
3

Il contient des éléments comme des définitions de classe, un pool de chaînes, etc. Je suppose que vous pourriez l'appeler des méta-données.

pseudo
la source
3

L'espace Permgen est toujours appelé zone de méthode. Lorsque le sous-système du chargeur de classe charge le fichier de classe (code d'octet) dans la zone de méthode (permGen). Il contient toutes les métadonnées de la classe, par exemple: le nom complet de votre classe, le nom complet de la classe parente immédiate, les informations sur les variables, les informations sur le constructeur, les informations sur le pool de constantes, etc.

Amruta
la source
2

Ce qui existe sous PremGen: la zone de classe relève de la zone PremGen. Les champs statiques sont également développés au moment du chargement de la classe, ils existent donc également dans PremGen. La zone de piscine constante contenant tous les champs immuables regroupés comme String est conservée ici. En plus de cela, les données de classe chargées par les chargeurs de classe, les tableaux d'objets, les objets internes utilisés par jvm sont également localisés.

salut.nitish
la source
1

PermGen Space est synonyme d'allocation de mémoire pour la génération permanente Tous les objets immuables Java entrent dans cette catégorie, comme celui Stringqui est créé avec des littéraux ou avec des String.intern()méthodes et pour charger les classes en mémoire. PermGen Space accélère notre recherche d'égalité des chaînes.

Spark-Débutant
la source
1
  • JVM a une représentation interne des objets Java et ces représentations internes sont stockées dans le tas (dans la jeune génération ou la génération titulaire).
  • JVM a également une représentation interne des classes Java et celles-ci sont stockées dans la génération permanente

entrez la description de l'image ici

Roopesh Payyanath
la source