2011-05-09 10 views
19

en uno de nuestros servidores, Garbage Collection tomó casi tres horas para tratar de reducir (con éxito) 1.2 GB de memoria de montón. De 1.4GB a 200MB.Tres horas para que GC reduzca 1,2 GB de pila, ¿cuál podría ser el motivo?

Durante este tiempo, el uso de la CPU fue alto, casi 80-100%. ¿Cuál podría ser la razón? Tenemos 4 de tales servidores con la misma configuración (configuración de JVM, configuración del servidor, hardware, red), suponiendo que nadie haya hecho ningún cambio en ella, lo que podría ser la razón por la cual el servidor en particular ejecutó un GC de 3 horas.

Todos los demás servidores tardaron solo de 5 a 10 minutos para cada actividad de GC.

Amablemente adjuntó un gráfico de HP BAC para su fácil referencia. Muestra la hora en la que supongo que se inició el GC, y cuando el GC se detuvo.

enter image description here

(Stephen Como señala para los resultados más concluyentes) Proporcionar esta información cuando el administrador del servidor se pone de nuevo a mí:

  • La versión exacta de la JVM está utilizando . (Estándar Java SE 1.4.2)
  • Las opciones de JVM. (Próximamente)
  • Detalles de el contenedor web/base del servidor. (Próximamente)
  • Información sobre qué hace el servicio . Cualquier pista relevantes de los archivos de registro del servidor /servicio (Coming)
  • ningún patrones relevantes en los registros de solicitudes (Coming)
  • Los registros de GC para la hora del evento . (Si actualmente no tiene habilitado el registro GC, puede que tenga que activarlo y esperar hasta que el problema se repite .) (Coming)
+1

Supongo que no estaban bromeando cuando dijeron que el tiempo para la asignación de memoria dinámica no tiene límites ... (Por cierto, ¿qué significa BAC? Me confundí por un segundo, pensé que representaba algo no relacionado, lol .) – Mehrdad

+0

Hola Mehrdad, creo que es sinónimo de Business Activity Center. –

+0

Hola Mehrdad, ¿a qué te refieres con "la asignación dinámica de memoria no tiene límites", ¿te refieres a la desasignación? Desde GC barre ... thx. –

Respuesta

10

Usted no proporciona mucha información, pero posible las razones pueden ser:

  • Errores en su aplicación; p.ej. una pérdida de memoria con algunas características bastante peculiares, o una tarea que se sigue quedando sin memoria y luego reiniciar.

  • Un ataque de denegación de servicio accidental o deliberado; p.ej. Algún cliente que sigue reintentando una solicitud sobredimensionada con parámetros que reducen el "tamaño del problema" cada vez.

  • Una única solicitud de larga duración con ciertas características.

  • Thrashing - vea la respuesta de @Trent Gray-Donald. (Si ha sobrecargado la memoria, entonces los algoritmos GC, que implican mirar lotes de objetos dispersos aleatoriamente en muchas páginas, es muy probable que provoquen agallas. No estoy seguro de que esto resulte en un uso gradual de la pila como usted están viendo.)

  • Una combinación patológica de la configuración de JVM.

  • Un error en el recolector de basura en la JVM particular que está utilizando.

  • Alguna combinación de las anteriores.

Este es el tipo de problema que justificaría obtener un contrato de soporte Oracle/Java.


La siguiente información puede ayudar a diagnosticar esta:

  • La versión exacta de la JVM que está utilizando.
  • Las opciones de JVM.
  • Detalles del contenedor web/base del servidor.
  • Información sobre lo que hace el servicio.
  • Cualquier pistas relevantes de los archivos de registro del servidor/servicio
  • cualquier patrón relevantes en los registros de solicitudes
  • Los registros de GC para la hora del evento. (Si actualmente no tiene habilitado el registro de GC, puede necesitar habilitarlo y esperar hasta que vuelva a aparecer el problema.)
+0

Hola Stephen, ¿qué información puedo proporcionar? Con gracias. –

11

No hay muchos datos para trabajar desde aquí, pero mi corazonada: está intercambiando. La única vez que vemos que los tiempos de GC van tan alto es cuando has comprometido demasiado el cuadro y está paginando al disco. Eso puede convertir las cosas en un orden de magnitud (o más) degrado de rendimiento.

Necesita recopilar SO (y posiblemente hipervisor, si corresponde) intercambiando estadísticas para probar o refutar esta teoría.

(Sé que el tiempo de CPU es mayor de lo que cabría esperar para el bombeo, pero nunca se sabe.)

También sería de gran ayuda si usted envió la configuración del hardware, "java -version" información, y JVM argumentos de la línea de comando (p. ej .: -Xmx y -Xms) para ayudar a reducir lo que realmente está ejecutando.

+0

Hola Gray, gracias por tus comentarios, publicaré la configuración de hardware en un momento (podría ser de unos pocos días a una semana, necesito contactarme con el equipo del servidor para obtener estos datos). Pero cuando mencionó el intercambio, ¿se refiere al intercambio de páginas entre la memoria y el disco?¿Por qué ocurre esto para la JVM? - ¿Podría la JVM haber pasivado objetos que no estaban en uso en los discos y luego el intercambio? –

+2

Correcto, sí, me refiero a la página de intercambio de memoria a/desde el disco. Puede ocurrir por varias razones: su caja está comprometida en exceso para la memoria, su -Xmx es demasiado grande para su caja, tiene una pérdida de memoria nativa, etc. –

+0

El sistema operativo debe tener más RAM que la asignada al montón de JVM (-Xmx). –

Cuestiones relacionadas