2009-10-27 11 views
59

Estaba revisando el documento en Java Memory Management y me encontré con PermSize que no pude entender. El documento dice que almacena, "JVM almacena sus metadatos", pero no pude entender exactamente qué significan los metadatos. Estaba buscando en Google y en algún lugar que lo leí almacena un objeto de valor (objeto definido por el usuario).¿Qué es 'PermSize' en Java?

¿Qué tipo de objetos se almacenan allí? Un ejemplo con una explicación sería genial.

+0

El valor predeterminado es 64m para máquinas virtuales de 64 bits. Lo aumentamos a '512m' para un servidor tomcat que ejecuta 8 aplicaciones de rieles.'-XX: MaxPermSize = 512m -XX: PermSize = 512m'. Tomcat con muchas definiciones de clase necesita un gran PerSize y con ruby, ruby ​​on rails combinado con jruby ... necesita un gran PermSize. –

+2

Tenga en cuenta que la generación permanente (y con ella los parámetros de PermSize) desaparecen en Java 8. Se reemplazan por el "Metaspace". Ver http://javaeesupportpatterns.blogspot.co.uk/2013/02/java-8-from-permgen-to-metaspace.html – sleske

Respuesta

100

una definición rápida de la "generación permanente":

"La generación permanente se utiliza para de retención de datos de reflexión del propio VM tales como objetos de clase y método objetos Estos objetos reflectantes son . asignado directamente en la generación permanente , y tiene un tamaño independientemente de las otras generaciones ". [ref]

En otras palabras, aquí es donde van las definiciones de clase (y esto explica por qué puede llegar el mensaje OutOfMemoryError: PermGen space si una aplicación carga un gran número de clases y/o de redistribución).

Tenga en cuenta que PermSize es adicional al valor -Xmx establecido por el usuario en las opciones de JVM. Pero MaxPermSize permite que la JVM pueda hacer crecer el PermSize a la cantidad especificada. Inicialmente, cuando se carga la VM, MaxPermSize seguirá siendo el valor predeterminado (32mb para -client y 64mb para -server) pero no tomará esa cantidad hasta que se necesite. Por otro lado, si se va a establecer tanto PermSize y MaxPermSize a 256mb, se daría cuenta de que el montón global se ha incrementado en 256 MB adicional para el ajuste -Xmx.

9

El grupo permanente contiene todo lo que no son datos de la aplicación, sino elementos necesarios para la VM: normalmente contiene cadenas internas, el código de byte de clases definidas, pero también otros datos "no tuyos".

22

This blog post da una buena explicación y algunos antecedentes. Básicamente, la "generación permanente" (cuyo tamaño viene dado por PermSize) se usa para almacenar cosas para las cuales la JVM tiene que asignar espacio, pero que (normalmente) no serán recogidas basura (de ahí "permanentes") (+). Eso significa, por ejemplo, clases cargadas y campos estáticos.

También hay un FAQ on garbage collection directamente de Sun, que responde algunas preguntas sobre la generación permanente. Finalmente, aquí hay un blog post con muchos detalles técnicos.

(+) En realidad, las partes de la generación permanente serán GCed, p. los objetos de clase se eliminarán cuando se descargue una clase. Pero eso no era común cuando la generación permanente se introdujo en la JVM, de ahí el nombre.