2012-04-19 22 views
8

Estamos ejecutando un portal liferay en tomcat 6. Cada portlet es una aplicación web contenida, por lo que incluye todas las bibliotecas que el portlet mismo necesita. Actualmente tenemos más de 30 portlets. El resultado de esto es que la permgen de nuestro tomcat aumenta con cada portlet que implementamos.Tamaño grande de Permgen + impacto en el rendimiento

Ahora tenemos dos caminos que podemos seguir. Mueva algunas de las bibliotecas utilizadas por cada uno de nuestros portlets a la biblioteca compartida de tomcat. Esto incluiría cosas como spring/hibernate/cxf/.... para disminuir nuestro tamaño de permgen O más fácil sería aumentar el tamaño de permgen.

Esta segunda opción nos permitiría mantener cada portlet como una entidad autocontenida.

La pregunta ahora es, ¿hay algún impacto negativo en el rendimiento al aumentar el tamaño de permgen? Actualmente estamos corriendo a 512MB. He encontrado poca o ninguna información sobre esto. Pero encontré algunas publicaciones en las que la gente hablaba de correr 1024MB de tamaño permgen sin problemas.

+0

No esperaría que un PermGen de 1 GB causara problemas. –

+1

Pregunta relacionada: http://stackoverflow.com/q/9636328/1140748 –

+0

Esto no responde a su pregunta, pero agrega otro aspecto: considero que la decisión de tener 1 portlet por extensión es una limitación artificial. Con la cantidad de portlets que brindas, apuesto a que hay algunos relacionados en los que recomendaría considerar paquetes relacionados. Esto se encargará de sus molestias y en mi humilde opinión aumentar la información general sobre sus complementos. –

Respuesta

3

Mientras tenga suficiente memoria en su servidor, no puedo imaginar que algo pueda salir mal. Si no lo hace, bueno, el Tomcat ni siquiera arrancaría, probablemente, porque no sería capaz de asignar suficiente memoria. Entonces, si se inicia, estás bien. En lo que respecta a mi experiencia, 1GB PermGen es perfectamente sonido.

La desventaja de un PermGen grande es que le deja menos memoria del sistema que luego puede asignar para el montón (Xmx).

Por otro lado, le aconsejo que reconsidere los beneficios de pensar en los portlets como entidades autónomas. Por ejemplo:

  • problemas de interoperabilidad: si todos los módulos de función están autorizados a utilizar potencialmente diferentes versiones del mismo bibliotecas, existe cierto riesgo de que no van a cooperar entre sí y con el propio portal como pretende
  • rendimiento: la huella de PermGen es solo una cosa, pero agregar frascos aquí y allá en los portlets requerirá descriptores de archivos adicionales; No sé sobre Windows, pero esto dañará el rendimiento del servidor de Linux a largo plazo.
  • libertad de cambio: si está utilizando Maven para construir portlets, el cambio de lib/ext liberaciones a lib bibliotecas de portlets es sólo una cuestión de cambiar el alcance dependencias (esto puede ser más molesto con libs portal); por lo que yo recuerdo, Liferay SDK también hace que sea fácil hacer un cambio similar con la hormiga para hacer un cambio similar en un instante mediante la adición de tarea ant adicional para resolver las dependencias y eliminarlos de portlets de lib según sea necesario
+0

perm gen no es parte del montón de Java, no tendrá ningún efecto en Xmx –

+0

No lo hará solo, pero te dejará menos memoria para asignar a Xmx, ¿no? –

+0

sí, tienes razón Michal - no leyó "menos memoria" como "menos memoria del sistema". –

1

La memoria PermGen puede ser basura recogida por colecciones completas, por lo que aumentarla puede aumentar la cantidad de tiempo del GC cuando se lleva a cabo una recolección completa.

Sin embargo, estas colecciones no deberían tener lugar con demasiada frecuencia, y normalmente tardarían menos de un segundo en total GC 1GB de memoria permgen. Solo estoy sacando este número de la memoria (algo brumosa), así que si están realmente preocupados por los tiempos de GC para algunas pruebas de tiempo (use -verbose:gc y lea los registros, más detalles here)

0

El tamaño de Permgen está fuera de OLD Gen, por favor no lo mezcle. Estamos de acuerdo en el 2º punto: podemos aumentar el tamaño del permiseño tanto como podemos hacerlo, ya que la memoria es bastante económica, pero esto generaría algunas dudas sobre cómo estamos administrando nuestro código. ¿Por qué diablos necesitamos tanta permeabilidad? ¿JTa consume tanto? ¿Cuántas clases estamos cargando? Cuántos descriptores de archivos está abriendo la aplicación (verifique con el comando lsof). Deberíamos tratar de responderlas.

+0

Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar aclaraciones de un autor, deje un comentario debajo de su publicación; siempre puede comentar sus propias publicaciones, y una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) lo hará poder [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment). –

+0

Dado que, supongo, la acusación de mezclar fue apuntada a mi respuesta, volví a redactar la frase en cuestión un poco para que quede más claro. Simplemente quise decir que aumentar la porción de memoria del sistema que se le da a PermGen le dejará menos "torta" para darle a Xmx. En cuanto a su pregunta sobre el uso de la memoria, tiene toda la razón en su confusión, pero OP está ejecutando liferay, y liferay crea ClassLoaders separados para cada portlet que despliegue en él. Esto puede significar que la totalidad de, por ejemplo, la primavera se clasificó varias veces y así es como PermGen fácilmente sube por las nubes con Liferay. –

Cuestiones relacionadas