Perché il programma di debug rallentare così tanto quando si utilizza l'ingresso di debug metodo?
Domanda
Sto utilizzando interfacce JDI per creare un debugger e quando uso MethodEntryRequests per abilitare il metodo ingresso tracciando il programma di debug rallenta per il fattore di decine. Ho impostato filtro per thread principale e sospendere la politica di SUSPEND_EVENT_THREAD. Classfilter è limitato e se stampo eventi ricevuti non mostra più di due dozzine di quelli per cui non dovrebbe ricevere troppo di loro. Sto debug a livello locale e dopo aver followind tipo di riga di comando con il programma Java debug:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=y,server=y,address=1337
Soluzione
La risposta breve è che l'esecuzione attraversa l'interprete, quando sono impostate le voci di metodo. Non penso che ci sia comunque intorno a questo ...
Questo era il caso per tutto il codice in esecuzione in modalità di debug, ma è stata arricchita in 1,4 ... ora HotSpot lavora per il debugging 'piena velocità' tranne nel caso di ingressi e uscite metodo, e quando watchpoints singolo passo o metodi che contengono i punti di interruzione.
Altri suggerimenti
2 motivi:
- deve aggiungere controlli su ogni voce di metodo (Non v'è alcuna opzione per modificare solo alcuni metodi)
- metodo inline diventa impossibile (Così piccoli metodi corre 10-100x volte più lento)
stesso vale per i profiler e applicazioni .net
Parto dal presupposto che il debugger ha bisogno di svegliarsi per ogni chiamata di metodo per vedere se corrisponde a quello (s), che sono stati selezionati per rompere. Perché deve controllare ogni chiamata di metodo per un potenziale incontro prima che possa eseguirlo è notevolmente più lento rispetto se non hanno a che fare tutti questi controlli.