2010-07-03 13 views
6

que tienen una instancia de Tomcat que se expone el siguiente comportamiento:Cómo investigar la excesiva recolección de basura de Java

  • aceptar una sola solicitud entrante http.
  • Emita una solicitud a un servidor back-end y recupere aproximadamente 400 kb de XML.
  • Pase este XML y transfórmelo en aproximadamente 400kb de JSON.
  • Devuelve la respuesta JSON.

El problema es que durante el manejo de la solicitud de 400k, mi aplicación web genera aproximadamente 100mb de basura que llena el espacio Eden y desencadena una colección de generación joven.

He intentado utilizar la funcionalidad incorporada en java hprof para hacer perfiles de sitios de asignación pero Tomcat no pareció iniciarse correctamente con eso en su lugar. Es posible que estuviera un poco impaciente ya que imagino que los perfiles de asignación de memoria tienen una sobrecarga elevada y, por lo tanto, el arranque de tomcat puede llevar mucho tiempo.

¿Cuáles son las mejores herramientas para crear perfiles de memoria Java de objetos muy jóvenes/¿basura? No puedo usar los volcados de heap porque los objetos que me interesan son basura.

Respuesta

1

Puede usar el generador de perfiles en jvisualvm en el JDK para hacer perfiles de memoria.

También eche un vistazo a las plantillas para almacenar en caché el transformador XSLT.

http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/Templates.html

+0

La creación de perfiles de Jvisualvm es difícil ya que mi servidor tomcat se ejecuta en Linux y prefiero evitar el exceso de ejecución en Windows donde realizo mi desarrollo o la instalación de un cuadro de Linux GUI. – mchr

+2

Instale el JDK correspondiente en la Linuxbox y redireccione jvisualvm para usar un servidor X11 que se ejecute en su cuadro de Windows. Xming directamente en la máquina, o Knoppix ejecutándose en una sesión de vmware, funciona muy bien. –

+2

También tenga en cuenta que si agrega el vudú apropiado a la invocación de JVM de Tomcat, jvisualvm puede conectarse desde su Windowsbox sin más preámbulos. –

0

Debería poder conseguir que los volcados de pila funcionen de todos modos depurando la aplicación, colocando puntos de interrupción en los puntos clave del código y creando un volcado de pila mientras la aplicación está en pausa en cada punto de interrupción.

+0

Sospecho que la basura es de corta vida, en cuyo caso sería extremadamente difícil detectar qué bits se han asignado recientemente. Lo ideal es que desee algo como el perfil de memoria vm visual, que puedo ejecutar de nuevo mi proceso de tomcat en mi servidor Linux. – mchr

0

Es posible que desee probar LambdaProbe, que es un generador de perfiles para Tomcat. Es compatible con lo siguiente:

general

sonda Lambda (anteriormente Tomcat Probe) es una aplicación web autosuficiente, lo que ayuda a visualizar diversos parámetros del ejemplo Apache Tomcat en tiempo real. Lambda Probe está diseñado para trabajar específicamente con Tomcat, por lo que puede acceder a mucha más información que normalmente está disponible para los agentes JMX. Aquí hay una lista de características disponibles a través de Sonda Lambda:

  • ¡Nuevo! Uso completo de la memoria JVM monitor.
  • JBoss compatibilidad
  • Visualización de las aplicaciones desplegadas, su estado, número de sesiones, sesión recuento de objetos, objeto de contexto de recuento, uso de la fuente de datos, etc.
  • Iniciar, detener, reiniciar, desplegar y updeploy de aplicaciones
  • Posibilidad de ver archivos JSP desplegados
  • Posibilidad de compilar todos o archivos JSP seleccionados en cualquier momento.
  • Posibilidad de precompilación de archivos JSP en la implementación de la aplicación .
  • ¡Nuevo! Capacidad para ver servlets JSP generadas automáticamente
  • Visualización de lista de sesiones para una aplicación particular
  • Visualización de los atributos de la sesión y sus valores para una aplicación particular . Posibilidad de eliminar los atributos de la sesión .
  • Posibilidad de ver los atributos de contexto de la aplicación y sus valores.
  • Capacidad de expirar sesiones seleccionadas
  • Representación gráfica de fuente de datos detalles, como el número máximo de conexiones , el número de ocupados conexiones y detalles de configuración
  • Nuevo! Capacidad de la fuente de datos grupo propiedades de URL para ayudar a visualizar impacto en las bases de datos
  • capacidad de restablecer las fuentes de datos en el caso de aplicaciones con fugas conexión
  • Visualización de información del sistema incluyendo System.properties, memoria barra de uso y OS detalles
  • Visualización de JK estado de conector incluyendo la lista de solicitudes pendientes de ejecución
  • en tiempo real gráficos de uso del conector y estadísticas.
  • Monitoreo de clúster en tiempo real y gráficos de tráfico clulster
  • Nuevo! en tiempo real el uso de memoria del sistema operativo, intercambiar uso y monitoreo utilización de la CPU
  • Capacidad para mostrar información sobre registro de archivos y descargar archivos seleccionados
  • Capacidad de archivos de registro en la cola tiempo real desde un navegador.
  • capacidad de interrumpir la ejecución de "colgar" las peticiones del servidor sin reiniciar
  • Nuevo! Posibilidad de reiniciar Tomcat/JVM a través de Java Serview Wrapper.
  • disponibilidad "Comprobación rápida"
  • Soporte para el DBCP, C3P0 y Oracle fuentes de datos
  • Soporte para Tomcat 5.0.x y 5.5.x
  • soporte para Java 1.4 y Java 1.5
2

Como al problema real: el análisis de XML puede ser muy difícil de memorizar cuando se utiliza un analizador basado en DOM. Considere usar un analizador basado en SAX o binary XML (VTD-XML es una API de Java basada en eso).

En realidad, si el mapeo XML-> JSON es puro 1: 1, entonces también puede considerar leer el XML y escribir el JSON en tiempo real línea por línea usando una pequeña pila.


Volver a la pregunta: ¿Es mejor utilizar VisualVM para esto. Puede encontrar here un artículo de blog sobre cómo hacer que funcione con Tomcat.

Cuestiones relacionadas