2011-02-04 30 views
8

Tenemos una aplicación web desplegada en un servidor tomcat. Hay ciertos trabajos programados que ejecutamos, después de lo cual la memoria del montón alcanza su máximo y se estabiliza, todo parece estar bien. Sin embargo, el administrador del sistema se queja de que el uso de memoria ('superior' en Linux) sigue aumentando cuanto más los trabajos programados. ¿Cuál es la correlación entre la memoria del montón y la memoria de la CPU? ¿Puede ser controlado por cualquier configuración de JVM? Usé JConsole para supervisar el sistema.
Forcé la recolección de basura a través de JConsole y el uso del montón bajó, sin embargo, el uso de memoria en Linux se mantuvo alto y nunca disminuyó.Memoria de proceso Vs Heap - JVM

¿Alguna idea o sugerencia sería de gran ayuda?

+0

El servidor es aparentemente un servidor de 64 bits. – user546352

+0

¿Sabe qué JVM se está ejecutando el servidor y cuál era la diferencia entre el uso de la memoria del montón y el uso real de la memoria después de forzar la recolección de basura? –

+0

>> sin embargo, el uso de memoria en Linux se mantuvo alto y nunca disminuyó. << ¿Cuál es "el uso de la memoria"?Al GC generalmente no le gusta devolver memoria al sistema. – bestsss

Respuesta

4

¿Qué se observa probablemente es el tamaño virtual y no el tamaño del conjunto residente de los procesos de Java? Si tiene un objetivo para un tamaño pequeño, puede no incluir -Xms o cualquier tamaño mínimo en los argumentos del montón JVM y ajustar el 70% -XX:MaxHeapFreeRatio= a un número menor para permitir una contracción más agresiva del montón.

Mientras tanto, proporcione más detalles sobre lo que se observó con el comentario que la memoria de Linux nunca disminuyó. ¿Qué métrica?

+0

Con el comando 'arriba', el% MEM sigue siendo alto y continúa subiendo a medida que se programan más trabajos, el% de CPU disminuye y el montón parece estar bien. – user546352

+0

% MEM es el% de RES en proporción a la memoria primaria, por lo que generalmente informa el tamaño de residente en primario. ¿Qué son las opciones '-Xms' y' -Xmx'? También calcule el% de RES/VIRT y% RES/SHR e informe de nuevo. Puede informar alto pero el proceso (es) puede tener una buena porción compartida. – Xailor

+0

Supuse que SHR está en kilobytes y así es como se muestra. RES/VIRT = 56% y RES/SHR = 117.79 este es el resultado superior con la opción 'M'. PID USUARIO PR NI VIRT RES SHR S TIEMPO% de la CPU% MEM + COMANDO 14425 17 0 raíz 1990m 1,1 g S 9792 0.0 54.5 23: 01.62 java Esto es después de que hice el cambio que sugeriste de -XX: MaxHeapFreeRatio, se parece comportarse un poco mejor, todavía estoy realizando algunas pruebas. Observé que la CPU% excede el 100% cuando se ejecutan los trabajos ... – user546352

0

Puede usar las configuraciones -Xmx y -Xms para ajustar el tamaño del montón. Con Tomcat puede establecer una variable de entorno antes de empezar:

export JAVA_OPTS=”-Xms256m -Xmx512m” 

Esto crea inicialmente un montón de 256MB, con un tamaño máximo de 512 MB.

Algunos detalles más: http://confluence.atlassian.com/display/CONF25/Fix+ 'Out + de + Memory' + errores + by + + aumentar la memoria disponible +

8

La memoria asignada por el proceso de JVM no es el mismo que el tamaño de la pila. El tamaño de almacenamiento dinámico utilizado podría disminuir sin una reducción real en el espacio asignado por la JVM. La JVM debe recibir un desencadenador que indique que debe reducir el tamaño del montón. Como @Xepoch menciona, esto está controlado por -XX:MaxHeapFreeRatio.

Sin embargo, el administrador del sistema se queja de que el uso de memoria ('superior' en Linux) sigue aumentando cuanto más se ejecutan los trabajos programados.

Eso es porque es muy probable que tenga algún tipo de pérdida de memoria. Los administradores del sistema tienden a quejarse cuando ven que los procesos mastican lentamente más y más espacio.

¿Alguna idea o sugerencia sería de gran ayuda?

¿Has mirado la cantidad de hilos? ¿Está la aplicación creando sus propios hilos y enviándolos a un punto muerto y esperando ociosamente para siempre? ¿Se está integrando con cualquier API de terceros que pueda estar utilizando JNI?

+2

+1 para verificar JNI. – Xailor