2010-05-31 10 views
6

Come ricordo c'è un'opzione di riga di comando magica in Java che attiva la scrittura di operazioni che sono attualmente eseguite in console. L'output era simile al codice byte.Dettagli di esecuzione Java in System.out

non corrisponde poiché stampa solo il caricamento di classe, mentre questa opzione genera informazioni come allocazione di memoria, impostazione di variabili locali ecc. Era molto dettagliato, come 10 linee per "Hello world".

non ho trovato né qui né http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp qui http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html Inoltre ho trovato alcune bandiere here, ma la maggior parte di loro lavorano solo in OpenJDK o in modalità svilupparsi. Forse c'è un modo in cui posso avviare java.exe su Windows in questa modalità di sviluppo? O forse c'è un altro gruppo di bandiere che questo elenco manca?

+1

+1 Vorrei saperlo anche questo. – naiad

risposta

2

Non proprio quello che hai chiesto, ma sono un grande fan di "kill -3" nell'id del processo java - che scarica tutti i tipi di informazioni su ogni thread e in quale stato sono, quali blocchi tengono e quali serrature stanno aspettando, e quel genere di cose.

+0

'jstack' è abbastanza pulito. –

+0

Ci sono strumenti là fuori per analizzare queste discariche e mostrarle più bene, ad es. the Thread Dump Viewer: http://sourceforge.net/projects/tdv/ – ZeissS

+0

+1 e nota che "kill -3" è un termine improprio (il comando "kill" in realtà è malinteso) perché non uccide affatto processi. Lo dico perché ho letto (e sentito) quella domanda più volte: * "ucciderà il processo?" *. No, non lo farà, invia semplicemente un segnale che, come risultato, emette molte informazioni dalla JVM sulla console :) – NoozNooz42

1

In Windows utilizzare Ctrl-Break per creare un dump del thread. Per monitorare classloading uso -verbose:class per la raccolta dei rifiuti -verbose:gc

1

opzioni supportate here. Il più vicino che riesco a trovare nella descrizione è -verbose: gc o forse -verbose: classe.

javap emetterà bytecode, ma è un disassemblatore statico e non correlato al runtime.

1

Sto usando jvisualvm un po 'di recente; forse questo ti darebbe quello che vuoi? Esegue la profilatura dell'utilizzo della memoria e della CPU, può scaricare stack di thread e può persino convincere la JVM a elencare l'attività del classloader (tramite il supporto MBean: andare a java.langClassLoading, selezionare Attributes e aggiornare Verbose; a System.out ovviamente). La cosa grandiosa di questo è che non hai bisogno di nulla per abilitarlo (normalmente); puoi semplicemente allegare a JVM già in esecuzione. (Se hai Java 1.5, usa invece .)

Nota comunque che è improbabile che tu riesca a scaricare i bytecode. Questo perché il motore HotSpot JIT, che è in circolazione da alcuni anni, converte i bytecode in istruzioni native prima dell'esecuzione, quindi al momento dell'esecuzione effettiva del codice, non vi sono semplicemente bytecode disponibili per la strumentazione. Teoricamente potresti essere in grado di costruire una VM speciale che funzionava alla vecchia maniera, ma sarebbe terribilmente lenta (come i vecchi tempi) quindi perché vorresti davvero?

+0

ho bisogno l'uscita di runtime come logger in modalità debug, ma il basso livello – John

+0

Bene , la cosa buona di jvisualvm è che può connettersi a JVM e girare all'interno. Una delle cose che puoi fare (con il plugin MBeans) è entrare nei controlli su se registrare le classi caricate ('java.lang → ClassLoading → Verbose') e attivarlo modificando il flag. La bellezza di questo? Non è necessario aver ricordato di impostare il flag quando hai avviato la JVM. –

+0

Modificato in quanto sopra alla mia risposta. –