2011-10-14 14 views
6

Estamos escribiendo una gran aplicación GUI en Scala con muchas clases, y hemos tenido que aumentar el espacio PermGen para poder cargar todas las clases. La aplicación en sí muestra una serie de actividades basadas en pantalla, cada una de las cuales carga su propio conjunto grande de clases. Solo una actividad se carga/muestra en cualquier momento. Después de pasar por un par de actividades, tuvimos un OutOfMemoryError en el espacio de PermGen.Ahorro de espacio PermGen con varios cargadores de clases

Entiendo que el espacio PermGen es garbage collected just like the rest of the heap, pero estoy interesado en ver si puedo reducir el espacio PermGen necesario al tener, p. un ClassLoader por actividad para permitir la descarga de clases.

Así:

  1. entiendo que las clases cargadas por el cargador de clases de sistema no pueden ser descargados, ya que siempre serán referenciados por su cargador de clases. ¿Es eso cierto?
  2. Si no hay más instancias de una clase cargada por mi cargador de clases personalizado, y el cargador de clases puede ser basura, ¿se descargarán sus clases, liberando espacio PermGen?
  3. ¿Hay alguna advertencia con respecto a (o errores comunes que evitarían) la descarga de clases?
+0

¿Qué tan grande es su PermGen? –

+0

128m es demasiado pequeño, 256m funciona por ahora, pero ¿por cuánto tiempo? ... –

Respuesta

6

... si puedo reducir el espacio PermGen necesario al tener, p. un ClassLoader por actividad para permitir la descarga de clase.

Sí, la única forma en que se pueden descargar las clases es si el Classloader utilizado es basura. Esto significa que las referencias a cada clase individual y al cargador de clases en sí deben ser cero.

¿Qué tan grande es su PermGen? Puede salirse con la suya simplemente golpeando PermGen con:

-XX:MaxPermGen=256m 

en su línea de comando. No es raro establecerlo en 512 m. Si desea una solución verdaderamente robusta, necesitará ir por la ruta de usar un cargador de clases personalizado por 'actividad'. Para ayudar con la depuración, agregue el siguiente argumento explica por sí mismo a la línea de comandos, así:

-XX:+TraceClassLoading 

Esto imprimirá clases medida que se cargan en la JVM a la línea de comandos.

+0

Gracias por la respuesta. Parece que '-XX: + TraceClassloading' no está disponible en mi versión de JRE 1.6.0_26 en Mac OS X; cualquier reemplazo? –

+0

-XX: + TraceClassLoading –

+0

OK, esto funciona, gracias. También uso '-XX: + TraceClassUnloading' ahora. –

Cuestiones relacionadas