2010-01-31 17 views
10

Estoy intentando tener Tomcat, que se está ejecutando actualmente como un servicio en un cuadro de Windows 2003, volcar el montón en un OutOfMemoryError.¿Puedo ejecutar Tomcat como un servicio para descargar?

(Tomcat se está ejecutando Hudson, que está reportando un problema de espacio de almacenamiento dinámico en el extremo final de mi construcción. Ejecución de la acumulación produce manualmente hay tal error. Los chicos Hudson necesitan un volcado del montón para empezar.)

Como se indica en otra parte, le dije al Apache Service Monitor que configure la JVM que usa para ejecutar Tomcat y volcar el montón cuando se encuentra un OutOfMemoryError agregando lo siguiente a las opciones de JVM: -XX: + HeapDumpOnOutOfMemoryError Luego ejecuto la compilación de nuevo. Efectivamente, informa que hubo un error de montón. Escaneo todo el disco buscando el archivo predeterminado java_pid123.hprof (donde obviamente 123 se reemplaza por el PID de la JVM). No existen archivos .hprof en ninguna parte.

Estoy atrapado en una trampa 22: Necesito el basurero para que los chicos de Hudson arreglen su pérdida de memoria, pero no puedo obtener el volcado del montón si ejecuto Hudson bajo Tomcat.

¿Hay alguna forma especial, cuando Tomcat se ejecuta como un servicio de Windows, de obtener un volcado de pila en un OutOfMemoryError?

La otra cosa que he intentado es decirlo, en las pestañas de Inicio y Apagado, para usar la opción "Java" en lugar de la opción "jvm". Creo que esto debería decirle al Administrador de servicios que intente iniciar Tomcat con un comando ejecutable de Java en lugar de ejecutar el jvm.dll directamente. Cuando hago esto, el servicio no se iniciará.

Seguramente alguien más ha tenido un problema similar?

+0

Debo mencionar que me he conectado a Tomcat con jconsole y observé que el uso del montón nunca supera los 60MB. –

Respuesta

5

Finalmente, después de poner éste a la cama, quería responder a esta para otros que podrían tener el mismo problema.

En primer lugar, si instala Tomcat en Windows, no use el instalador .exe, aunque lo promueva Apache. No le permitirá ejecutar Tomcat como otra cosa que no sea la cuenta del sistema, sin importar lo que haga. Parece que la cuenta del sistema no tiene privilegios para escribir archivos .hprof en el directorio actual, y no aparece ninguna cantidad de ajustes de seguridad de Windows para que este problema desaparezca.

OK, por lo que ha instalado Tomcat de la distribución .zip. Instálelo como un servicio utilizando el script service.bat. Asegúrese de que esté configurado para ejecutarse como un usuario específico que creó específicamente para este propósito. Asegúrese también de que la carpeta en la que desea que Tomcat escriba en el caso de que se produzca un volcado de almacenamiento dinámico puede ser escrita por ese usuario.

Edite el archivo service.bat para incluir las opciones -XX:+HeapDumpOnOutOfMemoryError y -XX:HeapDumpPath=C:\whatever en el lugar correcto (donde puede colocar las opciones de JVM). Eso debería hacer el truco.

0

Los archivos .hprof se vuelcan en el directorio actual. Exactamente lo que eso significa para un servicio de Windows es una incógnita, suponiendo que signifique algo.

Sugiero publicar una nueva pregunta (en http://superuser.com) preguntando qué significa "directorio actual" para un servicio de Windows.

+0

Directorio actual, tal vez, pero ningún archivo .hprof está presente en la máquina en absoluto. –

+0

Por lo tanto, es posible que los servicios de Windows no tengan "directorio actual" y Windows está volcando el archivo al vacío. Mi sugerencia acerca de saber más acerca de los servicios de Windows se encuentra. – skaffman

+0

El monitor de servicio afirma que el directorio actual es C: \ Archivos de programa \ Apache Tomcat \ Tomcat 6.0. Escribí un servlet que genera un archivo en el directorio actual y el archivo aparece en ese directorio. –

0

From 20 Tips for Using Tomcat in Production

Añadir lo siguiente a sus JAVA_OPTS en catalina.sh (o catalina.bat para Windows): - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

+0

El problema, por supuesto, es que el monitor del servicio no invoca ninguna secuencia de comandos. –

1

He encontrado el siguiente enlace, que describe cómo configurar el servicio de tomcat (incluye el establecimiento de los parámetros java). No estoy seguro de si se aplica a la versión que está ejecutando.

http://tomcat.apache.org/tomcat-5.5-doc/windows-service-howto.html

+0

Gracias; eso de hecho es útil, pero debería haber mencionado que estoy ejecutando Tomcat 6. –

0

si ha instalado tomcat con .exe puede configurar el servicio tomcat para usar una cuenta que no sea de sistema local y puede asignar esos derechos de usuario en el directorio "c: \ whatever" donde está creando su archivo de volcado. Una cosa aquí para recordar el servicio de tomcat no se ejecuta con la cuenta que tiene privilegios administrativos. así que cree un usuario simple en Windows (miembro del grupo de usuarios) y configure los servicios de tomcat para que usen esta cuenta. y otorgar esos derechos de usuario en el directorio "c: \ whatever". Esto resuelve el problema de los derechos del directorio de usuario, pero debe configurar tomcat para los errores de Volcado de memoria.

0

Cuando el proceso java ejecutándose como servicio de la ventana se puede generar el Heapdump utilizando los pasos siguientes,

  1. Ejecutar la consola de comandos como administrador
  2. versión de JDK (para el mando jmap) y JRE (entorno de aplicación de ejecución de Java) debería ser lo mismo.
  3. obtener el PID no se ejecuta el proceso de la ventana para que la aplicación Java desde el administrador de tareas
  4. Ejecutar comando a continuación

jmap -dump: file = d: \ Heapdump \ myHeapDump.hprof -F #PID_No #

Si tiene alguna excepción con JDK/JRE 7 intente lo mismo con JDK/JRE 8 en realidad me enfrentaba algún problema en jmap con JDK 7, pero cuando me mudé a JDK 8, que fueron capaces de generar con éxito el volcado del montón usando el mismo comando

Cuestiones relacionadas