Con esta versión de java -XX: + DoEscapeAnalysis da como resultado mucha menos actividad de gc y una ejecución 14 veces más rápida.
$ java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing)
$ uname -a
Linux xxx 2.6.18-4-686 #1 SMP Mon Mar 26 17:17:36 UTC 2007 i686 GNU/Linux
Sin un análisis escape,
$ java -server -verbose:gc EscapeAnalysis|cat -n
1 start
2 [GC 896K->102K(5056K), 0.0053480 secs]
3 [GC 998K->102K(5056K), 0.0012930 secs]
4 [GC 998K->102K(5056K), 0.0006930 secs]
--snip--
174 [GC 998K->102K(5056K), 0.0001960 secs]
175 [GC 998K->102K(5056K), 0.0002150 secs]
176 10000000
Con el análisis de escape,
$ java -server -verbose:gc -XX:+DoEscapeAnalysis EscapeAnalysis
start
[GC 896K->102K(5056K), 0.0055600 secs]
10000000
La ejecución en tiempo reduce significativamente con el análisis de escape. Para ello, el bucle se cambió a iteraciones 10E9,
public static void main(String [] args){
System.out.println("start");
for(int i = 0; i < 1000*1000*1000; ++i){
Foo foo = new Foo();
}
System.out.println(Foo.counter);
}
Sin un análisis de escape,
$ time java -server EscapeAnalysis
start
1000000000
real 0m27.386s
user 0m24.950s
sys 0m1.076s
Con el análisis de escape,
$ time java -server -XX:+DoEscapeAnalysis EscapeAnalysis
start
1000000000
real 0m2.018s
user 0m2.004s
sys 0m0.012s
Así que con el análisis de escape el ejemplo corrió sobre 14 veces más rápido que el análisis de no escape se ejecuta.
Documentación de Oracle: después del análisis de escape, el compilador del servidor elimina las asignaciones de objetos escalares reemplazables y los bloqueos asociados del código generado. El compilador del servidor también elimina bloqueos para todos los objetos que no escapan globalmente. NO REEMPLAZA UNA ASIGNACIÓN DE HEAL CON UNA ASIGNACIÓN DE PILA. – anstarovoyt
@anstarovoyt No reemplaza una asignación de pila con una asignación de pila PARA OBJETOS QUE NO ESCAPEN DE FORMA NO GLOBAL. – Aliaxander
@Aliaxander se formuló la pregunta en 2009 y mi respuesta fue en 2013 :) – anstarovoyt