2011-11-16 12 views
5

Así que cada dos días mi proceso de Java en Ubuntu muere automáticamente, y no puedo entender por qué.Algo sigue matando mi proceso de Java en Ubuntu, ¿alguien sabe por qué?

Mi caja tiene 35.84 GB de RAM, cuando lance mi proceso de Java, le paso el parámetro -Xmx28g, por lo que debería estar utilizando mucho menos que la RAM máxima disponible.

me corrieron jstat de la siguiente manera:

# jstat -gccause -t `pgrep java` 60000 

Las últimas líneas de salida de jstat inmediatamente antes del proceso mataron fueron:

Time  S0  S1  E  O  P  YGC YGCT  FGC FGCT  GCT  LGCC     GCC 
14236.1 99.98 0.00 69.80 99.40 49.88 1011 232.305 11 171.041 403.347 unknown GCCause  No GC 
14296.2 93.02 0.00 65.79 99.43 49.88 1015 233.000 11 171.041 404.041 unknown GCCause  No GC 
14356.1 79.20 0.00 80.50 99.55 49.88 1019 233.945 11 171.041 404.986 unknown GCCause  No GC 
14416.2 0.00 99.98 24.32 99.64 49.88 1024 234.945 11 171.041 405.987 unknown GCCause  No GC 

Esto parece ser lo que pasó en el/var/log/syslog en este momento: https://gist.github.com/1369135

No hay nada en ejecución en este servidor que no sea mi aplicación java. ¿Que esta pasando?

editar: Estoy ejecutando la versión 1.6.0_20 de java, los únicos parámetros notables que paso a java en el inicio son "-server -Xmx28g". No estoy usando un servidor de aplicaciones, pero mi aplicación incorpora el "Marco web simple".

+0

Max physical ram no equivale a la cantidad que puede utilizar un proceso. Eric Lippert tuvo una excelente publicación en este . Sé que la publicación está centrada en Windows/.NET, pero también es muy elástica. Solo por curiosidad, ¿puedes intentar capturar un OutOfMemoryError y registrar esto para confirmar/negar que esta es la causa? –

+1

Estoy registrando stdout y stderr, que creo que es donde iría un OOM, y no veo nada que indique una excepción de OOM ... Según mi experiencia, un OOM da como resultado que la aplicación deje de funcionar y no muera. En este caso, parece que el SO ha matado a la aplicación. – sanity

Respuesta

5

(Segundo intento).

Suponiendo que el problema es el asesino de OOM, entonces ha matado a su proceso en un intento desesperado de mantener el sistema operativo en una grave crisis de escasez de memoria.

Me gustaría concluir que:

  • la JVM que realmente está utilizando mucho más que 28GB; es decir, tiene un uso significativo de la memoria que no es de montón, y

  • el sistema operativo no está configurado con una cantidad adecuada de espacio de intercambio.

Intentaré agregar más espacio de intercambio, para que el sistema operativo pueda intercambiar partes de su aplicación en caso de emergencia.

Como alternativa, reduzca el tamaño del almacenamiento dinámico de la JVM.


Tenga en cuenta que "-Xmx ..." Establece el tamaño máximo del montón, no la cantidad máxima de memoria que la JVM puede utilizar. La JVM coloca algunas cosas fuera del montón, incluidas cosas como la memoria para las pilas de subprocesos y los archivos mapeados en memoria que utiliza la aplicación.

+1

¿De qué manera lo dice el syslog vinculado? La consola dice que java fue asesinado, no que se haya detenido. Si se hubiera quedado sin memoria, normalmente arrojaría una excepción OutOfMemory, que no fue así. Estoy ejecutando un montón tan grande porque necesito almacenar millones de objetos, cada uno de los cuales requiere varios kilobytes de RAM. – sanity

+0

@sanity - vuelva a leer ... –

+0

Según algunos otros consejos, estoy reduciendo el uso máximo de la memoria a 15GB – sanity

1

wow, ¿de verdad puedes tener 28 GB de pila ?! Puede ser que intentes reducirlo, mantenlo en no más del 50% de la RAM, creo (así que ~ 18 GB, o incluso 15 GB). ¡Más 171 GC completos son muchos! ¿Cuánto tiempo estuvo funcionando esta aplicación? 171 en 2-3 días suena enorme. Por cierto, la esencia indica un OOM antes de la terminación: creo que reducir el montón lo arreglará (puede estar limitando que la JVM no expanda el espacio nativo). Intenta ajustar varios parámetros, prueba el tamaño de la pila, por ejemplo (-Xss) si es necesario. Verifique el tamaño de la permanente máxima y otras secciones también. Es un problema de memoria y puede no ser necesariamente el montón.

+0

oops misread, en realidad son 11 GC completos, pero aún hay bastantes. es definitivamente un OOM y deberías intentar reducir el tamaño del montón. – aishwarya

+0

Disculpe, no veo dónde la esencia indica un OOM, no puedo ver ningún OOM en stdout o stderr para el proceso: -/¿Por qué es importante que todo el montón solo use el 50% de RAM? Seguramente, el -Xmx especifica la máxima RAM que usará Java. – sanity

+0

.. también, no reducirá el tamaño del montón * aumenta * la probabilidad de un OOM? – sanity

2

¿Qué JVM estás usando? y que servidor de aplicaciones? Es posible que esté asignando demasiada memoria, y eso puede ser problemático: el recolector de basura podría tener problemas para hacer su trabajo.

No estoy seguro si este es tu caso, pero encontré un artículo muy interesante this que explica la forma en que Linux sobrepasa la memoria.

+0

Actualicé mi pregunta con la información que solicitaste – sanity

6

Bienvenido a OOM-killer, una 'característica' de Linux que es la perdición de las aplicaciones de memoria grande en todas partes. No hay una receta simple para tratar, solo busque google y comience a leer y a modelar.

Aunque no puedo poner mis dedos mentales en una explicación concisa de las shenigans del OOM killer, recuerdo que el parámetro de ajuste crítico se llama 'swappiness'. En uno de nuestros grandes servidores, tenemos:

/etc/sysctl.conf:vm.swappiness=20

Leer http://www.gentooexperimental.org/~patrick/weblog/archives/2009-11.html.

+0

Puedes ¿Resumir por qué el OOM-killer mataría a una aplicación usando solo 28GB en una máquina con 35GB de RAM y básicamente no hay otros procesos ejecutándose en ella? – sanity

+0

ver también http://stackoverflow.com/questions/15237067/how-do-i-configure-oom-killer – yegor256

Cuestiones relacionadas