2012-08-24 35 views
189

Específicamente, ¿por qué sería útil corregir un problema PermGen OutOfMemoryError?¿Qué hace -XX: MaxPermSize?

Además, los puntos de bonificación para una respuesta que me apunta a la documentación sobre los argumentos de JVM ...

+0

http://mark.koli.ch/2009/01/understanding-javas-perm-gen-maxpermsize-heap-space-etc.html –

+5

http://www.oracle.com/technetwork/java/javase /tech/vmoptions-jsp-140102.html ¿Cómo me darás esos puntos de bonificación ahora?:) –

+1

@PaulTomblin No estoy seguro de que el tipo cuyo artículo está enlazando (el primer resultado de Google) tenga alguna idea de lo que está hablando. –

Respuesta

207

El espacio permanente donde es, métodos, cadenas interiorizados, y objetos similares utilizados por la máquina virtual se almacenan las clases y nunca desasignado (de ahí el nombre).

This Oracle article presenta sucintamente el funcionamiento y parametrización del HotSpot GC y le aconseja que aumentar este espacio si se carga muchas clases (este es el caso típico de los servidores de aplicaciones y algunos IDE como Eclipse):

El 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 dinámicamente y cargan 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 puede aumentarse con la opción de línea de comando -XX: MaxPermSize =.

Tenga en cuenta que this other Oracle documentation enumera los otros argumentos de HotSpot.

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

75

-XX: PermSize -XX: MaxPermSize se utilizan para establecer el tamaño de 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 completa de basura. Si la recolección de basura completa no puede eliminar las clases antiguas sin referencia y no queda espacio para expandir el espacio permanente, se genera un error de falta de memoria (OOME) y la JVM se bloqueará.

+9

+1 para los errores específicos y la línea de tiempo de lo que sucede. – Tony

35

En Java 8 que parámetro se utiliza comúnmente para imprimir un mensaje de aviso como este:

Java HotSpot (TM) 64-Bit servidor advertencia VM: opción ignorando MaxPermSize = 512m; el apoyo se retiró al 8,0

La razón por la que recibe este mensaje en Java 8 se debe a PermGen ha sido reemplazado por metaespacio para abordar algunos de los inconvenientes de PermGen (como se haya podido ver por sí mismo, uno de los inconvenientes es que tenía un tamaño fijo).

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

+2

Ver también: [Eliminación de PermGen en JDK 8] (http://stackoverflow.com/questions/18339707/permgen-elimination-in-jdk-8) (stackoverflow). – will

1

El MaxPermSize es el tamaño máximo para el montón de generación permanente, un montón que contiene el código de bytes de las clases y se mantiene separado del montón de objetos que contiene los casos reales.