2012-04-09 6 views
14

Quando Java JIT esegue la chiamata di un metodo in linea? Si basa su # volte viene chiamato il metodo del chiamante (se sì, quale sarebbe quel numero?), O altri criteri (e quale sarebbe?)Java: metodo JIT inlining

Ho letto che JIT può inline 'finale' metodi, ma incorpora anche metodi non finali basati su statistiche runtime, quindi vuoi sapere quali sono i criteri di attivazione.

Immagino che le risposte sarebbero diverse in base all'implementazione di JVM, ma forse c'è qualcosa di comune tra tutte loro?

+1

risposta facile, ma alcuni collegamenti che potrebbero aiutare - http://www.azulsystems.com/blog/cliff/2011-04-04-fixing-the-inlining-problem https: // wiki .oracle.com/display/HotSpotInternals/Inlining https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques – Matt

+0

Articolo un po 'correlato http://www.ibm.com/developerworks/java/library/j-jtp1029/index .html –

risposta

16

La risposta breve è quando vuole.

Molto spesso un JITC inline automaticamente piccoli metodi finali o pseudo-finali, senza prima raccogliere alcuna statistica. Questo perché è facile vedere che l'inlining salva effettivamente i byte di codice rispetto alla codifica della chiamata (o almeno che è quasi un "lavaggio").

Inlining i metodi non definitivi non vengono solitamente eseguiti a meno che le statistiche suggeriscano che vale la pena, dato che i non-finali inline devono essere "sorvegliati" in qualche modo nel caso in cui una sottoclasse inaspettata arrivi.

Per quanto riguarda il numero di volte che è possibile chiamare qualcosa prima che sia JITCed o inline, è altamente variabile e può variare anche all'interno di una JVM in esecuzione.

+0

Il "piccolo" dipende da #lines? Se sì, in genere fino a quanti significherebbe "piccolo"? – shrini1000

+4

Non numero di righe. Piuttosto, il numero stimato di byte del codice generato (sebbene la stima possa essere abbastanza approssimativa). Un JITC non vede "linee", ma vede piuttosto "bytecode". –

+2

E quando JITCing un metodo più grande, un JITC avrà generalmente un "budget" per la dimensione generata, e sceglierà roba in linea fino a che il "budget" è pieno. –

2

In genere, JIT esegue solo inline i metodi "piccoli" per impostazione predefinita. Oltre a questo è completamente dipendente dall'implementazione.

+0

Il "piccolo" dipende da #lines? Se sì, in genere fino a quanti significherebbe "piccolo"? – shrini1000

7

la soglia inline predefinita per una JVM su cui è in esecuzione il server Il compilatore Hotspot è 35 bytecode.

Official docs