78 votes

Perm espace vs espace de tas

Premièrement, quelle est la différence entre l’espace Perm et l’espace Heap (Que et comment la JVM choisit-elle d’utiliser chaque espace mémoire)?

Deuxièmement, mais surtout, quel type de rapport serait recommandé pour une application Java standard de type MVC?

76voto

Olhovsky Points 2817

Le tas de magasins de tous les objets créés par votre programme Java. Le tas de contenu est contrôlé par le garbage collector, ce qui libère de la mémoire dans le tas lorsque vous arrêtez d'utiliser un objet (c'est à dire quand il n'y a pas plus de références à l'objet.

Ceci est en contraste avec la pile, qui stocke les types primitifs comme les entiers et les caractères, et sont généralement variables locales et des valeurs de retour de fonction. Ce ne sont pas des ordures.

La perm de l'espace fait référence à une partie spéciale de la tas. Voir ce AFIN de répondre à une explication: Qu'est-ce que perm espace?

34voto

Christopher Yang Points 785

Personnellement, je ne considère pas la PermGen une partie spéciale de la tas.

Je préfèrerais faire penser à des tas comme une zone de mémoire dédié pour stocker des instances de l'objet tandis que la PermGen comme un espace dédié pour stocker les définitions de classe. En conséquence, un tas de cycle de vie est liée à une application lors de la PermGen du cycle de vie est liée à une JVM.

L'un des meilleurs exemples d'une application et sa JVM peut avoir différentes du cycle de vie est dans un conteneur Java EE. Dans un serveur d'application, les applications peuvent être déployées et non déployée sans redémarrer le serveur. Au cours de la undeployment (ou de réinsertion), il est facile de libérer toutes les instances de l'objet c'est à dire de la mémoire, mais c'est plutôt difficile à effacer toutes les classes chargées par cette app de PermGen parce que certaines classes peuvent encore être référencé par la JVM.

L'un de ces cas est la Fuite des Pilotes. Lorsqu'une application est déployée, un pilote JDBC est chargé et enregistré avec le DriverManager. Lorsque cette application est déployé, le DriverManager vies et tient une référence pour le conducteur, sa classe d'origine chargeur, et tout ce chargeur de classe chargé. En conséquence, une fuite de mémoire dans PermGen est créé, mais c'est pas la faute de l'application de gestion de la mémoire.

Il est vrai que les machines virtuelles comme JRocket n'ont pas PermGen à tous, tout est stocké en tas. C'est seulement dans ce contexte, pouvez-vous appeler PermGen une "partie spéciale" des tas. Même alors, nous devrions encore vue PermGen et tas différemment, car ils ont très différents et ils ont de très différents types de fuites de mémoire.

Mise à jour: Dans Oracle JDK 8, PermGen est remplacé par "Metaspace" et c'est maintenant officiellement partie du tas. Nous n'avons pas besoin d'ajuster précisément PermGen.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X