2012-02-02 5 views
28

Entrambe fanno praticamente la stessa cosa. Identifica che il metodo è caldo e lo compila al posto dell'interpretazione. Con OSR, basta passare alla versione compilata subito dopo la compilazione, diversamente da JIT, dove viene chiamato il codice compilato quando viene chiamato per la seconda volta.Differenze tra la compilazione Just in Time e la sostituzione in pila

Oltre a questo, ci sono altre differenze?

+4

Né google né wikipedia possono dirmi che cos'è l'OSR. –

+3

@ MaurícioLinhares google mi ha detto che è una sostituzione su stack. –

+0

Questo blog è un'altra buona risorsa ... http://www.azulsystems.com/blog/cliff/2011-11-22-what-the-heck-is-osr-and-why-is-it-bad- o-good –

risposta

42

In generale, La compilazione just-in-time si riferisce alla compilazione del codice nativo in fase di esecuzione e all'esecuzione anziché all'interpretazione (o in aggiunta a). Alcune macchine virtuali, come Google V8, non hanno nemmeno un interprete; loro JIT compilano ogni funzione che viene eseguita (con vari gradi di ottimizzazione).

On Stack Replacement (OSR) è una tecnica per il passaggio tra diverse implementazioni della stessa funzione. Ad esempio, è possibile utilizzare l'OSR per passare dal codice interpretato o non ottimizzato al codice JIT non appena termina la compilazione.

L'OSR è utile in situazioni in cui si identifica una funzione come "hot" mentre è in esecuzione. Questo potrebbe non essere necessariamente perché la funzione viene chiamata frequentemente; potrebbe essere chiamato solo una volta, ma trascorre molto tempo in un grande ciclo che potrebbe trarre vantaggio dall'ottimizzazione. Quando si verifica l'OSR, la VM viene messa in pausa e il frame dello stack per la funzione di destinazione viene sostituito da un frame equivalente che può avere variabili in posizioni diverse.

L'OSR può verificarsi anche nell'altra direzione: da codice ottimizzato a codice non ottimizzato o codice interpretato. Il codice ottimizzato può formulare alcune ipotesi sul comportamento di runtime del programma in base al comportamento passato. Ad esempio, è possibile convertire una chiamata di metodo virtuale o dinamica in una chiamata statica se si è sempre visto un solo tipo di oggetto destinatario. Se in seguito risulta che queste ipotesi erano sbagliate, l'OSR può essere utilizzato per ricorrere a un'implementazione più prudente: il frame dello stack ottimizzato viene convertito in uno stack frame non ottimizzato. Se la VM supporta l'inlining, si potrebbe persino finire per convertire uno stack frame ottimizzato in diversi frame stack non ottimizzati.

8

Sì, è quasi tutto. Just-in-time compilation può migliorare le prestazioni compilando "hot spot" (punti di bytecode noti/che si suppone eseguano molto spesso) di bytecode in istruzioni native. On-Stack Replacement integra le funzionalità JIT sostituendo il bytecode "hot" interpretato a lungo termine dalla sua versione compilata quando diventa disponibile. Il menzionato On-Stack Replacement article mostra un bell'esempio in cui la compilazione JIT non sarebbe molto utile senza OSR.

+4

Sfortunatamente, il collegamento dell'articolo non funziona più. Ecco un altro post su OSR: http://xmlandmore.blogspot.com/2012/06/on-stack-replacement-in-hotspot-jvm.html – Tvaroh

2

Le persone hanno già parlato di JIT.

on-stack di sostituzione (OSR)

Quando la JVM esegue un metodo Java, controlla la somma del numero di volte che il metodo è stato chiamato, e il numero di volte che ogni loop in il metodo si è ramificato e decide se il metodo è idoneo per la compilazione. Se lo è, il metodo viene accodato per la compilazione. Questo tipo di compilazione non ha un nome ufficiale, ma viene spesso chiamato compilazione standard .

Ma cosa succede se il metodo ha un ciclo molto lungo, o uno che non esce mai e fornisce tutta la logica del programma? In tal caso, la JVM deve compilare il ciclo senza attendere per un richiamo del metodo.Pertanto, ogni volta che il ciclo completa un'esecuzione, il contatore di diramazione viene incrementato e ispezionato. Se il contatore della ramificazione ha superato la propria soglia , il loop (e non l'intero metodo) diventa idoneo per la compilazione . Questo tipo di raccolta si chiama on-stack di sostituzione (OSR), perché anche se il ciclo viene compilato, che non è sufficiente: la JVM deve avere la possibilità di avviare l'esecuzione del versione compilata del loop mentre il loop è ancora in esecuzione. Quando il codice per il loop ha terminato la compilazione, la JVM sostituisce il codice (on-stack) e la successiva iterazione di il ciclo eseguirà la versione compilata del codice molto più veloce.