2009-12-28 14 views
6

Aquí hay una frase que oí mucho a lo largo de la escuela secundaria y clases de informática de la universidad:¿Cómo se diferencian las "JVM modernas" de las JVM antiguas?

"Eso no es un problema para las JVM modernas."

Normalmente esto podría surgir en las discusiones sobre el rendimiento general o las estrategias de optimización. Sin embargo, siempre fue tratado como una especie de respuesta final mágica, como si ya no valiera la pena pensar en los problemas. Y eso solo me lleva a preguntarme: ¿cuáles son las diferencias entre la "JVM moderna" prototípica y las JVM antiguas, realmente?

+1

El sello de fecha en el binario :-P – TofuBeer

+0

@TofuBeer: Gracias, Capitán Obvio. Correcto y conciso, entonces +1/aceptado. Oh, espera ... – Pops

+0

Pregunta relacionada que explica el bit de recolección de basura con más detalle: http://stackoverflow.com/questions/2931170/does-variable-null-set-it-for-garbage-collection – Pops

Respuesta

6

La mejora más significativa en la tecnología JVM es el compilador JIT: Just In Time. El JIT optimiza el código mientras se ejecuta, lo que produce enormes ganancias de rendimiento que hacen que Java (al menos en algunos dominios) sea competitivo con los programas C/C++.

Una discusión interesante sobre los beneficios de la optimización dinámica (como el código se ejecuta) frente a la optimización estática (durante la compilación) se puede encontrar en la charla de Steve Yegge: http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html (que, por cierto, es interesante).

Otras mejoras de JVM, que no están totalmente relacionadas con JIT, son el envío más rápido de métodos virtuales, tanto para métodos de clase como para métodos de interfaz.

6

La sincronización desatendida solía ser lenta.
La recolección de basura se ha vuelto mucho más rápida.
La optimización del punto de acceso ha mejorado.
Algunas JVM realmente antiguas tenían green threads en exclusiva.

+1

Iba a decir que la 'JVM moderna' es más una afirmación sobre el pobre rendimiento de las proto-JVM que una afirmación sobre la generación actual – Jherico

1

Un JIT moderna puede optimizar de forma agresiva código de máquina en base a información de perfil y otra información derivada del código de bytes:

  • código de máquina se puede generar con un nivel de optimización derivada del uso esperado (que se utilizó una mucho, tal vez se utilizará aún más). Esto ayuda mucho!
  • Las llamadas a object.getFoo() pueden estar en línea para que el contenido del método se coloque directamente en el código generado sin la llamada al método. Esto se puede hacer de forma recursiva, y puede resultar en la sustitución de un código complejo con solo unas pocas instrucciones realmente realizadas.
  • La recolección de basura ha mejorado enormemente. Esto significa que en mucho tiempo no se gasta.
Cuestiones relacionadas