¿Qué hace -XX: MaxPermSize?

260

Específicamente, ¿por qué ayudaría solucionar un problema de PermGen OutOfMemoryError?

Además, puntos de bonificación por una respuesta que me señala la documentación sobre los argumentos de JVM ...

Geoff
fuente
66
oracle.com/technetwork/java/javase/tech/… ¿Cómo me darán esos puntos de bonificación ahora? :)
Denys Séguret
1
@PaulTomblin No estoy seguro de que el tipo cuyo artículo está vinculando (el primer resultado de Google) tenga alguna idea de lo que está hablando.
Denys Séguret
@distroy ¿Puedo enviarte una cookie? O simplemente podría sentirse satisfecho con una pregunta bien respondida;)
Geoff
55
Esto no responde la pregunta específicamente, pero si está mirando la administración de memoria JVM, los mejores artículos que he leído son este y este enlace infoq
Abe

Respuestas:

274

El espacio permanente es donde las clases, métodos, cadenas internalizadas y objetos similares utilizados por la VM se almacenan y nunca se desasignan (de ahí el nombre).

Este artículo de Oracle presenta sucintamente el funcionamiento y la parametrización del HotSpot GC y le recomienda que aumente este espacio si carga muchas clases (este suele ser el caso de los servidores de aplicaciones y algunos IDE como Eclipse):

La generación permanente no tiene un impacto notable en el rendimiento del recolector de basura para la mayoría de las aplicaciones. Sin embargo, algunas aplicaciones generan y cargan dinámicamente muchas clases; por ejemplo, algunas implementaciones de páginas JavaServer Pages (JSP). Estas aplicaciones pueden necesitar una generación permanente más grande para contener las clases adicionales. Si es así, el tamaño máximo de generación permanente se puede aumentar con la opción de línea de comandos -XX: MaxPermSize =.

Tenga en cuenta que esta otra documentación de Oracle enumera los otros argumentos de HotSpot.

Actualización: a partir de Java 8, tanto el espacio permgen como esta configuración han desaparecido. El modelo de memoria utilizado para las clases y métodos cargados es diferente y no está limitado (con la configuración predeterminada). No deberías ver este error más.

Denys Séguret
fuente
93

-XX:PermSize -XX:MaxPermSize se utilizan para establecer el tamaño para la generación permanente.

Generación permanente: la generación permanente es donde se guardan los archivos de clase. Estos son el resultado de clases compiladas y páginas JSP. Si este espacio está lleno, desencadena una recolección de basura completa. Si la recogida de basura completa no puede limpiar las clases antiguas sin referencia y no queda espacio para expandir el espacio permanente, se produce un error de falta de memoria (OOME) y la JVM se bloqueará.

piedras333
fuente
48

En Java 8 ese parámetro se usa comúnmente para imprimir un mensaje de advertencia como este:

Advertencia de máquina virtual del servidor Java HotSpot (TM) de 64 bits: ignorando la opción MaxPermSize = 512m; el soporte fue eliminado en 8.0

La razón por la que recibe este mensaje en Java 8 es porque Permgen ha sido reemplazado por Metaspace para abordar algunos de los inconvenientes de PermGen (como pudo ver por usted mismo, uno de esos inconvenientes es que tenía un tamaño fijo).

FYI: un artículo sobre Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

AndrewBurgeois
fuente
66
Ver también: eliminación de PermGen en JDK 8 (stackoverflow).
será el