2009-04-15 8 views
11

come è possibile richiedere esternamente la garbage collection Java, avviando il programma da JAR (Windows BAT utilizzato)?Come richiedere la garbage collection JVM (non dal codice) quando viene eseguita dalla riga di comando di Windows

  • Dal codice Java che posso farlo con System.gc()
  • Quando si esegue una distribuzione JNLP, ottengo questo "console Java" attivata dal Pannello di controllo/Java/... e questa console Java fornisce spazzatura manuale collezione.

Ma ... Quando eseguo il jar da riga di comando/bat, la console java non sembra aprirsi. Non hai trovato l'aiuto con un breve googling, forse qualcuno qui?

risposta

9

È possibile utilizzare jconsole per connettersi a una JVM in esecuzione localmente. Fornisce un pulsante "Esegui GC" sulla GUI.

È necessario specificare -Dcom.sun.management.jmxremote quando si avvia la procedura java.

+0

Grazie, sembra funzionare bene! – Touko

5

Se si utilizza l'ultima versione di java 6, è disponibile anche jvisualvm che integra ed estende la funzionalità di jconsole. Sono entrambi strumenti molto utili.

1

Normalmente non si dovrebbe avere motivo di forzare la raccolta dei rifiuti. Così facendo, incasina gli algoritmi di garbage collector (principalmente le loro prestazioni). Inoltre rallenterà il programma mentre viene raccolta la spazzatura. Se c'è un problema di memoria, dovresti usare gli strumenti di tracciamento della memoria per scoprire dove vengono conservati i riferimenti? (Gli ascoltatori non sono registrati?)

Come nelle altre risposte, è possibile utilizzare jconsole o jvisualvm. Puoi anche usare jmx per farlo a livello di programmazione.

+0

Esistono molti usi legittimi per forzare la raccolta GC. Uno è a scopo di test. Un altro esempio: se si sta sviluppando in un sistema con memoria insufficiente con SSD swap. Java non sa se la memoria è "memoria veloce" o scambio. Quindi Java tende a utilizzare tutta la memoria libera prima di avviare automaticamente GC. Fire GC manualmente può aiutare molto in questo caso. Ovviamente non è raccomandato in ogni caso l'utilizzo di server (almeno non posso immaginarne uno ora). –

3

Per un approccio puramente a linea di comando, dovresti essere in grado di utilizzare jcmd. Credo che jcmd abbia fatto parte dell'installazione standard di JDK da almeno Java 1.7. Il comando sarebbe qualcosa di simile a questo:

jcmd <process-id> GC.run 

È possibile ottenere un elenco dei comandi diagnostici disponibili che jcmd prevede un particolare processo come questo:

jcmd <process-id> help 
Problemi correlati