2009-05-25 15 views
27

Estoy tratando de ejecutar el comando jstack en mi aplicación java. La aplicación es bastante grande, ejecutándose dentro de jboss AS ocupando aproximadamente 4 gb de memoria. OS es la edición estándar de Windows Server 2003. Cada vez que aparece un error "No hay suficiente espacio de almacenamiento disponible para procesar este comando". Hay suficiente ram, 16 gb y espacio en disco. Entonces, ¿alguna idea?Jstack y No hay suficiente espacio de almacenamiento disponible para procesar este comando

+3

Parece ser un mensaje de error de Windows. –

+0

Lo tengo en un Tomcat que está tomando 280 mb. – ripper234

+0

También miró a esta pregunta - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread No lo hace t ayuda ya que jconsole no ve la aplicación. – ripper234

Respuesta

43

me encontré con esto recientemente en WIN2008R2 y pensé en compartir mi solución, ya que tomó un tiempo para averiguar. Rob's comment about psexec -s es lo que hizo por mí.

Parece que en Vista y posteriormente jstack no funciona en contra de los servicios debido al contexto del usuario. No tiene nada que ver con la memoria. Sospecho que esta es la misma razón por la que la gente ha visto este problema en 2003 a través del escritorio remoto, a menos que use el modificador/admin o/console en mstsc. A partir de Vista, la seguridad reforzada es probablemente lo que lo rompió.

Iniciar mi aplicación desde una ventana de cmd funcionó bien, pero eso no me ayuda a depurar nuestra instalación estándar. Habilitar el puerto de depuración de Java (para VisualVM, Eclipse o la mayoría de los depuradores de Java) requiere reiniciar la aplicación, por lo que perderá el estado que probablemente esté tratando de capturar si aún no tiene habilitada la depuración. Comenzar el servicio con mis credenciales de usuario no funcionó. Me sorprendió un poco. Pero psexec -s ejecuta jstack desde el contexto del sistema, que funcionaba como un hechizo. Ah, y tendrá que ejecutar psexec desde un indicador elevado de cmd, si UAC está activado.

+0

Esto funcionó simplemente genial para mí. –

+1

ídem. gracias por salvar mi día –

+0

Esto funciona muy bien con Win 2003. Muchas gracias – dAm2K

3

Tuvimos problemas al ejecutar JStack en una máquina con Windows incluso con una aplicación modesta (1GB). Terminamos haciendo nuestro análisis de pila y montón usando Netbeans. Esto pareció hacer frente al análisis de los archivos de volcado mucho mejor. YMMV.

Prueba Netbeans para crear perfiles: es muy bueno. Tenga en cuenta que VisualVM es un perfilador de NB de reducción y viene con 6u7.

7

En el pasado he visto esto cuando la JVM se ejecuta como un servicio de Windows en Windows 2003.

En primer lugar, comprobar para ver si se trata de una issue with the TMP directory.

En segundo lugar, jstack (o las otras utilidades como jconsole) no se conectará al proceso local a menos que se ejecute en la misma sesión. Si el servicio se está ejecutando como un usuario específico, es posible que pueda conectarse iniciando sesión en la misma sesión. Si está utilizando Escritorio remoto, puede conectarse utilizando "mstsc/admin" (solía ser/consola) e intente ejecutar jstack nuevamente. Definitivamente, asegúrese de que el directorio TMP esté configurado correctamente si esto no soluciona el problema.

Si el servicio se está ejecutando como LocalSystem, el procedimiento anterior probablemente no ayude mucho. No sé si hay una forma de iniciar sesión en la misma sesión que LocalSystem.

Algunas otras alternativas pueden ser establecer el proceso para el monitoreo remoto y usar jvisualvm (desde el servidor mismo o desde otra máquina) para conectarse a través de un puerto y realizar un volcado de hilo.

+16

Solución si se ejecuta como Sistema local: Conéctese usando "mstsc/admin" usando una cuenta de inicio de sesión (no estoy seguro de los permisos exactos que necesita tener, el mío estaba en el grupo Administradores) y use la herramienta psexec Sysinternals de la siguiente manera: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Donde PID es la identificación del proceso de su proceso. También puede tener que sustituir la ruta real a su JDK dependiendo de su entorno específico. –

2

psexec -s jstack PID >> c:\jstack.log funciona perfectamente en la misma máquina. Por primera vez me tomó un tiempo pero nuevamente ejecuté con la opción de redirigir a archivo, que completó en unos pocos segundos.

Cuestiones relacionadas