2009-04-15 14 views
11

¿cómo puedo solicitar la recolección de basura de Java externamente, comenzando el programa desde JAR (Windows BAT utilizado)?Cómo solicitar la recolección de elementos no utilizados de JVM (no desde el código) cuando se ejecuta desde la línea de comandos de Windows

  • Desde el código Java que puedo hacerlo con System.gc()
  • Cuando se ejecuta una distribución JNLP, consigo este "consola de Java" encenderlo desde el Panel de control/Java/... y esta consola de Java proporciona manual de basura colección.

Pero ... Cuando ejecuto el contenedor desde la línea de comandos/bat, la consola java no parece abrirse. No pude encontrar ayuda con un breve google, tal vez alguien aquí?

Respuesta

9

Puede usar jconsole para conectarse a una JVM que se está ejecutando localmente - Esto proporciona un botón "Realizar GC" en la GUI.

Deberá especificar -Dcom.sun.management.jmxremote cuando inicie el proceso de java.

+0

Gracias, parece funcionar bien! – Touko

5

Si utiliza el último java 6 también tiene jvisualvm que complementa y amplía la funcionalidad de jconsole. Ambas son herramientas muy útiles.

1

Normalmente no debería haber ningún motivo para forzar la recolección de basura. Al hacerlo, arruina los algoritmos del recolector de basura (principalmente su rendimiento). También ralentizará el programa mientras se recoge la basura. Si hay un problema de memoria, debe usar las herramientas de seguimiento de memoria para averiguar dónde se están reteniendo las referencias. (¿Los oyentes no están registrados?)

Como en las otras respuestas, puede usar jconsole o jvisualvm. También puede usar jmx para hacerlo programáticamente.

+0

Hay muchos usos legítimos para forzar la recolección de GC. Una es para fines de prueba. Otro ejemplo: si está desarrollando en un sistema de memoria baja con intercambio SSD. Java no sabe si la memoria es "memoria rápida" o intercambio. Así que Java tiende a usar toda la memoria libre antes de disparar automáticamente GC. Fire GC manualmente puede ayudar mucho en este caso. Obviamente, no se recomienda en ningún caso el uso de la producción del servidor (al menos no puedo crear una imagen ahora). –

3

Para un enfoque puramente de línea de comandos, debe ser capaz de utilizar jcmd. Creo que jcmd ha sido parte de la instalación estándar de JDK desde al menos Java 1.7. El comando sería algo como esto:

jcmd <process-id> GC.run 

Usted puede obtener una lista de comandos de diagnóstico disponibles que jcmd prevé un proceso particular de esta manera:

jcmd <process-id> help 
Cuestiones relacionadas