2010-02-10 15 views
29

¿Cuál es la importancia del espacio PermGen en Java?Importancia de PermGen espacio

+0

posible duplicado de [¿Qué significa realmente PermGen?] (Http://stackoverflow.com/questions/318942/what-does-permgen-actually-stand-for) – rds

Respuesta

44

El espacio PermGen está reservado para objetos a largo plazo, en su mayoría Class objetos cargados por ClassLoader. PermGen no se recolectará como basura excepto en circunstancias muy especiales (específicamente, cuando el ClassLoader que cargó esas clases queda fuera del alcance).

Se trata de una optimización de recolección de basura: si los objetos que no esperamos recolectar como basura se almacenan por separado, se compacta el espacio donde se almacenan los demás objetos, lo que reduce el trabajo del recolector de basura.

+0

El ClassLoader al que se refiere es el Sistema cargador de clase? ¿Dónde se almacenan las clases cargadas por el cargador de clases de arranque? –

+0

Las clases cargadas por el cargador de bootstrap son las que forman parte integral del lenguaje, como 'String' y' Object'. Esto es parte de la implementación nativa de la JVM, por lo que no hay una respuesta estándar con respecto a "dónde". – danben

+0

Bien. Entonces, ¿el permgen contendrá las clases cargadas por el cargador de clases del sistema? –

6

La única cosa que realmente necesita saber es que el espacio PermGen está separado del montón general y no se ve afectado por el parámetro -Xmx VM. Si tiene una aplicación que carga muchas definiciones de clase (como un servidor de aplicaciones o un IDE), entonces puede establecer el tamaño del espacio PermGen usando la opción de máquina virtual -XX:MaxPermSize.

4

La generación permanente mantiene meta-datos que describen las clases de usuarios (clases que no son parte del lenguaje Java).

aplicaciones con grandes código-base puede llenar este segmento de la pila que hará que java.lang.OutOfMemoryError: PermGen. Esto no se ve afectado por la configuración -Xmx o la cantidad de memoria que tiene en la máquina. Para establecer un nuevo tamaño inicial, use -XX:PermSize=64m. Para establecer un tamaño máximo, utilice -XX:MaxPermSize=128m

+0

¿Qué quiere decir con "clases que no son parte del lenguaje Java"? ¿Conoces alguna clase que no esté almacenada en PermGen? – danben

8

El PermGen es específico de las máquinas virtuales que tiene la recogida de basura generacional.

Si se utiliza, por ejemplo, JRockit, la "importancia de PermGen" es inexistente debido JRockit no tiene ese concepto.

Solía ​​ser común, hace unos años, cuando comenzaron a aparecer los extraños errores "fuera de PermGen space" y que nadie sabía aún de quién era la falla (Tomcat + Hibernate + Sun VM solía activar esto) para reemplazar uno de los componentes (hoy en día se entienden los problemas, pero hace años, cuando comenzaron a cosechar, era casi imposible encontrar información sobre esto). Se podría sustituir Tomcat con resina o la máquina virtual de Sun con JRockit etc.

Creo que es importante señalar que PermGen no forman parte de las especificaciones de Java y sólo un detalle de implementación de la (bastante) algunas máquinas virtuales.

Cuestiones relacionadas