2012-04-09 19 views
14

Cuando hace Java JIT inline una llamada a un método? ¿Se basa en # veces se llama al método de la persona que llama (si es así, cuál sería ese número?), O algún otro criterio (¿y qué sería eso?)Java: método JIT en línea

He leído que JIT puede alinear 'final' métodos, sino que también incluye métodos no finales basados ​​en estadísticas de tiempo de ejecución, por lo que desea saber qué es ese criterio desencadenante.

Supongo que las respuestas diferirían según la implementación de JVM, pero tal vez haya algo común en todas ellas.

+1

hay una respuesta fácil, pero algunos enlaces que pueden ayudar - http://www.azulsystems.com/blog/cliff/2011-04-04-fixing-the-inlining-problem https: // wiki .oracle.com/display/HotSpotInternals/Inlinete https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques – Matt

+0

Artículo algo relacionado http://www.ibm.com/developerworks/java/library/j-jtp1029/index .html –

Respuesta

16

La respuesta corta es siempre que lo desee.

Muy a menudo, un JITC aplicará pequeños métodos finales o pseudo finales automáticamente, sin reunir ninguna estadística. Esto se debe a que es fácil ver que la línea de entrada ahorra bytes de código frente a la codificación de la llamada (o al menos es casi un "lavado").

Infiltrar métodos verdaderamente no finales no suele hacerse a menos que las estadísticas sugieran que vale la pena, ya que los no finales incorporados deben ser "protegidos" de alguna manera en caso de que surja una subclase inesperada.

En cuanto al número de veces que se puede invocar algo antes de que esté JITC o en línea, es muy variable y es probable que varíe incluso dentro de una JVM en ejecución.

+0

¿'Pequeño' depende de #lines? Si es así, ¿hasta cuántos querrían decir "pequeño"? – shrini1000

+4

No hay número de líneas. Más bien, el número estimado de bytes del código generado (aunque la estimación puede ser bastante cruda). Un JITC no ve "líneas", sino que ve "códigos de bytes". –

+2

Y cuando JITC utiliza un método más grande, un JITC generalmente tendrá un "presupuesto" para el tamaño generado, y elegirá las cosas en línea hasta que se llene ese "presupuesto". –

2

Normalmente, JIT solo enumera los métodos "pequeños" de forma predeterminada. Aparte de eso, es completamente dependiente de la implementación.

+0

¿'Small' depende de #lines? Si es así, ¿hasta cuántos querrían decir "pequeño"? – shrini1000

7

umbral en línea predeterminado para una JVM que ejecuta el servidor El compilador de zonas activas es de 35 códigos de bytes.

Official docs