domingo, 24 de abril de 2011

Tiered compilation en Hotspot 20 (Java 6u25)

Mientras seguimos esperando el cierre de versión de Java 7 (las listas de correo andan ardiendo estas últimas semanas, pero aún tardará), hace unos días salió Java 6 Update 25, donde por fin se incluye Hotspot 20. Aparte de que está también recién horneado Netbeans 7.0 (yo llevaba tiempo trabajando con las release candidates)...

A diferencia de los últimos updates, este sí promete mejoras de rendimiento, aunque la mala noticia es que el G1 (Garbage First) continúa en modo experimental... pero la buena noticia es que parece que la tiered compilation por fin parece que funciona, ¿habrá llegado el esperado maná, lo mejor de los dos mundos (-client y -server) en uno

Pego algunos extractos de las releases notes:

(...)

Java Hotspot VM 20
(...) contains improvements to performance, reliability and diagnostic information.

A new feature in this version of HotSpot is "tiered" compilation in the Server VM that enables it to start quickly as does the Client VM, while achieving superior peak performance. This feature is enabled by specifying -server and -XX:+TieredCompilation command options.

The Garbage First (G1) garbage collector continues to advance with Java SE 6u25, although it remains an experimental option.

HotSpot diagnostic information has been expanded in several ways (...)

Performance Improvement to BigDecimal
Improvements have been made to class BigDecimal enhancing its performance by thirty percent. BigDecimal is enabled by specifying -XX:+AggressiveOpts command option.

Performance Improvement to java.util.logging.LogRecord
The performance of the class java.util.logging.LogRecord has been enhanced. This enhancement improves the efficiency of including source class and method names in java.util.logging log records.

(...)


Y más información sobre "tiered compilation", por el ínclito Remí Forax, en http://weblogs.java.net/blog/forax/archive/2010/09/05/tiered-compilation, de donde me permito extraer:
"Tiered compilation in hotspot is an old dream. Hotspot has two JITs named c1 aka client JIT and c2 aka server JIT. The client JIT starts fast but provides less optimizations so it is used for GUI application. The server JIT starts more slowly but provide very good optimizations.
The idea of tiered compilation is to get the best of both compilers, first JITs the code with c1 and then if the code is really hot to recompile it with c2."


Obviamente en ejecuciones a largo plazo el "tiered compilation" no supone mejora general, pero sí durante los primeros minutos. He probado (como mera prueba) el arranque de Netbeans con -server -XX:+TieredCompilation y el rendimiento se aproxima a -client (al menos es infinitamente mejor que con -server), aunque a cada cosa lo suyo, para aplicaciones gráficas y applets, seguirá siendo mejor el compilador cliente (por ahora, quizás algún día deje de existir la doble opción)

Recopilando algunas de las últimas recomendaciones para aplicaciones servidor en arquitecturas de 64 bits que soporten NUMA, recomiendo probar estas opciones de arranque (con Java 6 u25 / Hotspot 20):

-server -XX:+TieredCompilation -XX:+UseCompressedOops -XX:+UseNUMA -XX:+UseParallelOldGC -Xverify:none -XX:+UseBiasedLocking -XX:+AggressiveOpts -Djava.net.preferIPv4Stack=true (aparte de los valores adecuados a cada caso para -Xms -Xmx -Xss -XX:PermSize -XX:MaxPermSize)

No hay comentarios: