2012-05-21 10 views
5

Mi comprensión es que PermGen (en cierto sentido) mantiene el código de clase en la memoria. A menudo tenemos muchos archivos jar referenciados en nuestro classpath. Cuando se incluye un archivo jar en el classpath (por ejemplo, en el directorio lib de tomcat), ¿se cargan automáticamente en el PermGen todas las clases de todos los jar?cuando las clases en tarros entran en PermGen

En una pregunta similar, una vez que se utiliza una clase de archivo jar, PermGen carga todas las clases en ese archivo jar, o solo la clase que se usa (y luego carga el resto de los archivos de clase cuando es necesario)?

Respuesta

4

Esto depende en cierta medida de la ejecución del cargador de clases y la JVM - la Java Virtual Machine specification dice esto:

Esta especificación permite una flexibilidad de aplicación en cuanto a cuando actividades de enlace (y, debido a la recursividad, la carga) llevará a cabo, siempre que la semántica del lenguaje de programación Java son respetado, [...]

Por ejemplo, una aplicación puede optar por resolver cada simbólica referencia en una clase o interfaz indi ually, solo cuando se usa (resolución diferida o tardía), o para resolverlos todos a la vez mientras se verifica la clase (resolución estática). Esto significa que el proceso de resolución puede continuar, en algunas implementaciones, después de que se haya inicializado una clase o interfaz .

En la práctica, ninguna implementación correcta debería cargar automáticamente todo en un archivo JAR simplemente porque se carga una clase en el archivo, y mucho menos simplemente porque está en el classpath.

0

Las únicas clases necesarias se cargan y almacenan en el espacio permgen.

0

El JLS garantiza que una clase se inicializa cuando, y tan pronto como sea necesario, primero. Sin embargo, la implementación puede cargar y enlazar antes.

+0

En realidad, la especificación permite explícitamente clases de precarga. Que una clase tenga que cargarse antes de usarse es bastante obvio. –

+0

¿Y qué hay de inicializarlos? –

+0

Esa es una cuestión diferente. No creo que la inicialización sea relevante para el uso de PermGen, aunque supongo que una implementación podría retrasar la carga de clases relacionadas hasta la inicialización. –

2

PermGen es un detalle de implementación de HotSpot y Oracle dijo que quieren deshacerse de él en el futuro [1]. No forma parte de la especificación Java (VM). Solo las clases cargadas terminan en PermGen. O explícitamente a través del ClassLoader#loadClass o implícitamente a través del enlace. Solo deberían ser las clases utilizadas (y sus dependencias) a menos que alguien esté cargando explícitamente todas las clases, por ej. para realizar una reflexión sobre ellos. Los marcos como Spring evitan esto y en su lugar escanean el código de bytes.

Un buen punto de observación es VisualVM que le permite observar las clases cargadas con un PermGen.

[1] JRockit no tiene PermGen y en las últimas versiones de HotSpot el grupo interno de cadena ya no está en PermGen.

+1

Vale la pena señalar que solo los objetos java.lang.Class, algunos de los objetos java.lang.String asociados con el nombre de la clase y los nombres de los métodos, y los objetos estáticos a los que hace referencia la clase se cargarán en PermGen. No es como si tu bytecode se carga allí o algo así ... –

Cuestiones relacionadas