¿Qué significa realmente PermGen?

122

Sé qué es PermGen, para qué se usa, por qué falla, cómo aumentarlo, etc.

Lo que no sé es qué significa realmente PermGen. Permanente ... Gen ... algo?

¿Alguien sabe lo que realmente significa PermGen?

SCdF
fuente
1
[Buena descripción] [1] del tipo que sabe mucho sobre los componentes internos de GC. Por cierto, hay mucha información útil relacionada con GC en su blog. [1]: blogs.oracle.com/jonthecollector/entry/…
Ivan Dubrov

Respuestas:

84

Generación permanente. Por supuesto, los detalles son específicos de la implementación.

Brevemente, contiene los objetos Java asociados con clases y cadenas internas. En la implementación del cliente de Sun con el uso compartido activado, classes.jsase asigna la memoria para formar los datos iniciales, con aproximadamente la mitad de solo lectura y la mitad de copia en escritura.

Los objetos Java que son simplemente antiguos se mantienen en la Generación de tenencia.

Tom Hawtin - tackline
fuente
19
"En JDK 7, las cadenas internas ya no se asignan en la generación permanente del montón de Java": oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
almalkawi
30
¡Y en JDK 8 no hay generación permanente en absoluto! Es divertido ver esta respuesta evolucionar a lo largo de los años.
Brian Gordon
3
@BrianGordon tiene razón ... Para obtener más información al respecto: stackoverflow.com/a/22509753/4557537
Fadi
59

La JVM utiliza PermGen para contener clases cargadas. Puedes aumentarlo usando:

-XX:MaxPermSize=384m

si está utilizando Sun JVM u OpenJDK.

Entonces, si obtiene una OutOfMemoryException: PermGen, necesita hacer que PermGen sea más grande o es posible que tenga problemas con el cargador de clases.

bajafresh4life
fuente
6
¿Cuál fue la respuesta aceptada en el momento de publicar este comentario? La respuesta actualmente aceptada ( esta , de "Tom Hawtin - tackline") me parece precisa. ¿Podría tener sentido editar su comentario para que no haga que las personas desconfíen de la respuesta aceptada actual?
jbyler
20

Generación permanente. Consulte la guía de ajuste de Java GC para obtener más detalles sobre el recolector de basura.

Dustin
fuente
8

No coincide realmente con la pregunta original, pero puede ser que alguien la encuentre útil. PermGen es de hecho un área de la memoria donde Java solía mantener sus clases. Entonces, muchos de nosotros nos hemos encontrado con OOM en PermGen, si hubiera, por ejemplo, muchas clases.

Desde Java 8, el área de PermGen ha sido reemplazada por el área de MetaSpace, que es más eficiente y es ilimitada de forma predeterminada (o más precisamente, limitada por la cantidad de memoria nativa, dependiendo de la disponibilidad de memoria virtual del sistema operativo y jvm de 32 o 64 bits). Sin embargo, es posible ajustarlo de alguna manera, por ejemplo, especificando un límite máximo para el área. Puede encontrar más información útil en esta publicación de blog .

Alex K.
fuente
3

Si mal no recuerdo, gen significa generación, como en un recolector de basura generacional (que trata los objetos más jóvenes de manera diferente a los objetos de mediana edad y "permanentes"). El principio de localidad sugiere que los objetos creados recientemente serán eliminados primero.

Uri
fuente
1

Permgen es sinónimo de generación permanente. Es una de las áreas de memoria de JVM. Es parte de Heap con un tamaño fijo mediante el uso de una bandera llamada MaxPermSize.

¿Por qué el nombre "PermGen"?

Este permgen fue nombrado en los primeros días de Java. Permgen mains mantiene todos los metadatos de las clases cargadas. Pero el problema es que una vez que se carga una clase, permanecerá en la JVM hasta que se cierre la JVM. Así que el nombre Permgen es optar por eso. Pero más tarde, la carga dinámica de clases entró en escena, pero el nombre no se cambió. Pero con Java 8 , también han abordado ese problema. Ahora permagen pasó a llamarse MetaSpace con tamaño de memoria dinámica.

Sumanth Varada
fuente