Pregunta

La JVM (especialmente el HotSpot VM) es famoso por tener un gran número de optimizaciones que se aplican en tiempo de ejecución.

¿Hay una manera de mirar a una determinada pieza de código y ver lo que la JVM en realidad ha hecho a él?

¿Fue útil?

Solución

Uno de los problemas es que "lo que en realidad JVM ha hecho a él" cambios entre invocaciones como la JVM es libre para volver a generar código.

A modo de ejemplo investigué hace unos días lo hotspot hace con métodos final comparación con los métodos virtuales. A juzgar por microbenchmarks, mis conclusiones fueron las siguientes:

  • Cliente JVM: si el método es efectivamente final (no hay ninguna clase cargada que lo anule), la JVM utiliza una llamada no virtual. Posteriormente, si se carga una clase que anula este método, la JVM cambiará el código JIT'ed para hacer las llamadas virtual. Por lo que se declara como finalhas relevancia no significativa.

  • Servidor JVM: Aquí final parece no tener relevancia tampoco. Lo que parece ocurrir es que la JVM genera una llamada que no virtual para cualquier clase que está utilizando la primera vez , independientemente de lo que sea se cargan clases. Posteriormente, si se realiza una llamada desde un objeto de otra clase, la JVM parchear todas las llamadas con algo similar a esto (supongo que también incluirá una reseña de llamadas para que pueda cambiar rápidamente de la ruta y camino lento si no llegó las cosas bien la primera vez):

    if (object instanceof ClassOfNonVirtualCall) {
        do non-virtual call to ClassOfNonVirtualCall.method
    } else {
        do virtual call to object.method
    }

Si usted está realmente interesado en ver el código generado, se puede jugar con las JVM de depuración de OpenJDK:

http://dlc.sun.com.edgesuite.net /jdk7/binaries/index.html

http://wikis.sun.com/display/HotSpotInternals/PrintAssembly

Otros consejos

Esto es altamente específica JVM, y lo más probable necesidad de hacer un poco de investigación seria en la JVM en particular que usted está mirando.

Se puede ver las opciones disponibles HotSpot VM aquí http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

El siguiente es un recurso muy bueno:

http://wikis.sun.com/display/HotSpotInternals/Home

Particularmente interesantes son la "herramienta LogCompilation" y "Visión general de enlaces LogCompilation" (enlaces no puede posterior directos como acabo registrados).

Esta es una buena página de HotSpot optimizaciones . Algunas de las optimizaciones se puede ver observando el código de bytes emitida por el compilador. Otras optimizaciones son dinámicos y sólo existen durante el tiempo de ejecución. Por ejemplo, HotSpot puede hacer sustitución on-pila que modifica la pila directamente durante el tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top