2010-11-11 8 views
7

Necesito una manera de poder activar el GC completo desde una secuencia de comandos de consola de Linux en ubuntu. Sé que esta es una práctica extremadamente mala, pero sin entrar en demasiados detalles, esto mantiene mi servidor en funcionamiento. Esto solo tiene una duración de 1 o 2 días mientras soluciono el problema real, por lo que no tengo que despertar en la noche y realice el GC manual a través de jconsole o jvisualvm.Cómo activar Java GC manual desde la consola de Linux sin X11

Como alternativa, tengo que hacer un script de mouse que haga clic en el botón cada 3 o 4 horas más o menos, lo que es aún peor.

Por favor ayuda.

Respuesta

11

Si usted puede tener su aplicación se inicia un servidor JMX (que creo que está implícito de su uso de jconsole/jvisualvm), entonces se puede invocar la operación del MBean memoria gc a través de utilidades de línea de comandos.

En primer lugar, necesitará algún tipo de cliente JMX de línea de comandos. He usado this one en el pasado para simples invocaciones de línea de comandos y funcionó bien. (Editar: De hecho, lo usé justo ahora para probar el siguiente comando, e invocó a GC con éxito en un proceso Tomcat local)

Luego tendrá que encontrar el comando para desencadenar la recolección de basura. Creo que esto debería funcionar (podrá, por supuesto, necesita cambiar anfitriones/puertos/credenciales en su caso):

java -jar cmdline-jmxclient-X.X.jar - localhost:8081 java.lang:type=Memory gc 

Por último, puede programar la invocación de este comando a través de cron o equivalente.

Voila!

+2

Esto funcionará. Es un poco aterrador que tengas que hacer esto, pero funcionará. –

+0

+1 a ese comentario, aunque a partir de la pregunta tengo la sensación de que Ævar ya es consciente de eso, y está utilizando esta técnica como una solución provisional. –

+0

Muchas gracias, lo intenté y funcionó, salvará la noche, aunque estoy muy cerca de solucionar el problema real. Para aclarar un poco el problema, he estudiado la configuración de GC por un tiempo y he realizado muchos ajustes.El problema no es que la JVM se está quedando sin memoria y el servidor realmente funciona bien, pero está filtrando los sockets CLOSE_WAIT, que solo se limpian durante el GC completo. Lo cual también es muy extraño, esto llena los grupos de conexiones y los límites del descriptor de archivos, y termina colgando el servidor. –

-2

No es una mala práctica, es imposible, incluso para la aplicación Java que ejecuta la JVM. Hay una llamada a gc() disponible, pero incluso es solo una sugerencia para que la JVM ejecute la recolección de elementos no utilizados. Desde la consola, normalmente no hay forma de influir en la JVM mientras se está ejecutando.

Algunos ha hecho esta pregunta para la plataforma Windows, vea la pregunta How to request JVM garbage collection (not from code) when run from Windows command-line

debes revisar los argumentos de JVM para los tamaños de pila/heap (tanto mínimo y máximo). Hay muchos ajustes que puede hacer en esa área, pero en su mayoría son específicos de la JVM que está utilizando.

JVM performance tuning for large applications

+0

Esto es-JVM específica. –

7

Si tiene oracle jvm 1.7, puede usar jcmd para listar los PID jvm, y luego jcmd <pid> GC.run para GC.

jcmd <pid> help le mostrará qué otros comandos están disponibles.

3
jcmd <pid> GC.run 

Ejemplo:

jcmd 20350 GC.run