2011-08-28 11 views
9

Sono solo curioso di sapere come sia possibile per Java JVM utilizzare metodi inline che possono potenzialmente generare eccezioni. Suppongo che sia possibile in linea almeno alcuni di questi metodi (come quelli che hanno accesso agli array e quindi il potenziale per lanciare ArrayIndexOutOfBoundsException s). Il problema che vedo è che se si verifica effettivamente l'eccezione, come si mostra la traccia di stack corretta se si è inline il metodo? Poiché diversi metodi possono essere allineati su macchine diverse, in che modo l'inlining non interrompe il meccanismo di tracciamento dello stack?In che modo i metodi di lancio delle eccezioni possono essere evidenziati?

+2

In C++, l'inlining garantisce quasi la perdita di informazioni sullo stack. Il fatto che una traccia dello stack di eccezioni manchi di una cornice non è la fine del mondo, però; è solo una conseguenza accettata dell'inlining (e una delle ragioni per cui i compilatori offrono opzioni in modalità debug per sopprimere tutte le inlining). Non so se Java si comporta allo stesso modo o no. –

+0

Intendevo che fosse una domanda Java, ma interessante sapere come funziona anche in C++. – Gravity

risposta

8

Qual è il problema che prevedi? Dal momento che è la stessa JVM che esegue l'inlining, non c'è nulla che gli impedisca di ricordare cosa contiene e dove corregge quando si costruisce una traccia stack da installare in un oggetto Throwable.

Quando viene generata un'eccezione generata da, la JVM calcola lo stack della CPU e determina se ciascun frame dello stack macchina corrisponde a codice interpretato, codice JITted, codice nativo dalle librerie e così via. Per questo si riferisce alle tabelle che indicano quali indirizzi nel codice macchina corrispondono a quali istruzioni dal bytecode (e più indietro alle linee di origine, se tale informazione è pressante nel file di classe). Questa tabella può perfettamente specificare che un determinato posto nel codice JITted può corrispondere a più di uno stack di livello Java.

Tuttavia, una JVM non è richiesta per eseguire questa operazione. Può anche scegliere semplicemente di costruire tracce di stack con interruzioni misteriose. Vedi lo javadoc for Throwable.getStackTrace(). (Non è nemmeno richiesto che una JVM sia in grado di produrre tracce dello stack in tutto).

3

Si potrebbe voler controllare this document che spiega come la gestione delle eccezioni funziona nella JVM:

Ogni metodo che catture eccezioni è associata ad un tavolo eccezione che è consegnato nel file di classe insieme al sequenza bytecode del metodo . La tabella delle eccezioni ha una voce per ogni eccezione che è rilevata da da ciascun blocco try. Ciascuna voce contiene quattro informazioni: i punti di inizio e fine, l'offset del PC all'interno della sequenza bytecode da saltare a e un indice di pool costante della classe di eccezione che è intercettata da .

+0

Sarò interessato a dare un'occhiata. Stavo chiedendo specificamente l'interazione di inlining con le eccezioni, però. Sembra che se una funzione è in linea, le informazioni sulla traccia dello stack andrebbero perse, ma non sembra essere in un programma Java. – Gravity

+1

Ricorda che l'inlining in Java avviene in fase di runtime, non in fase di compilazione come C/C++, quindi non stai "perdendo" alcuna informazione. Qualsiasi informazione che viene ottimizzata e che deve essere recuperata può essere memorizzata in una tabella di ricerca/salto. –

+0

Non memorizzare le informazioni sulle eccezioni nelle tabelle di ricerca causa prestazioni inaccettabili, specialmente per eccezioni molto comuni come ArrayIndexOutOfBounds? – Gravity

Problemi correlati