2009-12-28 27 views
6

Ecco una frase che ho sentito un sacco per tutto il liceo e universitari corsi di informatica:In che modo le "moderne JVM" differiscono dalle JVM più vecchie?

"Non è un problema per le JVM moderni."

Di solito questo si presentava nelle discussioni sulle prestazioni globali o sulle strategie di ottimizzazione. È sempre stata trattata come una sorta di risposta finale magica, però, come se facesse questioni a cui non vale più la pena di pensare. E questo mi porta a chiedermi: quali sono le differenze tra la prototipica "moderna JVM" e le vecchie JVM?

+1

Il timbro data sul file binario :-P – TofuBeer

+0

@TofuBeer: Grazie, Capitan Ovvio. Corretto e conciso, quindi + 1/accettato. Oh aspetta ... – Pops

+0

Questione correlata che spiega in modo più dettagliato il bit della garbage collection: http://stackoverflow.com/questions/2931170/does-variable-null-set-it-for-garbage-collection – Pops

risposta

6

Il miglioramento più significativo della tecnologia JVM è il compilatore JIT: Just In Time. Il JIT ottimizza il codice mentre viene eseguito, producendo così enormi guadagni di prestazioni che rendono Java (almeno in alcuni domini) competitivo con i programmi C/C++.

Un'interessante discussione sui vantaggi dell'ottimizzazione dinamica (mentre il codice viene eseguito) rispetto all'ottimizzazione statica (durante la compilazione) può essere trovata nel discorso di Steve Yegge: http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html (che, BTW è interessante di per sé).

Altri miglioramenti JVM, che non sono del tutto estranei a JIT, sono l'invio più veloce di metodi virtuali, sia per i metodi di classe che per i metodi di interfaccia.

6

La sincronizzazione non conforme era lenta.
La raccolta dei dati inutili è diventata molto più veloce.
L'ottimizzazione dell'hotspot è migliorata.
Alcune JVM molto vecchie avevano solo green threads.

+1

Stavo per Dite che la "moderna JVM" è più una dichiarazione sulla scarsa performance dei proto-JVM di una dichiarazione sulla generazione attuale – Jherico

1

Un JIT moderna può aggressivamente ottimizzare il codice macchina basata su informazioni di profilo e altre informazioni derivate dal codice di byte:

  • codice macchina può essere generato con un livello di ottimizzazione derivante dall'uso previsto (E 'stato utilizzato un molto, forse sarà usato ancora di più). Questo aiuta molto!
  • Le chiamate a object.getFoo() possono essere sottolineate in modo che il contenuto del metodo venga inserito direttamente nel codice generato senza la chiamata al metodo. Questo può essere fatto in modo ricorsivo e può far sostituire il codice complesso con solo poche istruzioni effettivamente fatte.
  • La raccolta dei rifiuti è migliorata immensamente. Ciò significa che non verrà speso molto tempo.