Avec cette version de java -XX: + DoEscapeAnalysis se traduit par beaucoup moins d'activité gc et une exécution 14 fois plus rapide.
$ 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
Sans l'analyse d'échappement,
$ 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
Avec l'analyse d'échappement,
$ java -server -verbose:gc -XX:+DoEscapeAnalysis EscapeAnalysis
start
[GC 896K->102K(5056K), 0.0055600 secs]
10000000
Le temps d'exécution réduit de manière significative avec l'analyse d'échappement. Pour cela, la boucle a été changé pour les itérations de 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);
}
Sans l'analyse d'échappement,
$ time java -server EscapeAnalysis
start
1000000000
real 0m27.386s
user 0m24.950s
sys 0m1.076s
Avec l'analyse d'échappement,
$ time java -server -XX:+DoEscapeAnalysis EscapeAnalysis
start
1000000000
real 0m2.018s
user 0m2.004s
sys 0m0.012s
Donc, avec l'analyse d'échappement l'exemple courait 14x plus vite que l'analyse non-échappée.
Documentation d'Oracle: Après l'analyse d'échappement, le compilateur de serveur élimine des allocations remplaçables scalaires d'objet et des verrous associés du code produit. Le compilateur de serveur élimine également les verrous pour tous les objets échappant à la globalité. IL NE REMPLACE PAS UNE ALLOCATION HEAP AVEC UNE ALLOCATION DE STACK. – anstarovoyt
@anstarovoyt Il ne remplace pas une allocation de tas avec une allocation de pile POUR DES OBJETS NON GLOBALEMENT ÉCHAPPÉS. – Aliaxander
@Aliaxander la question a été posée en 2009 et ma réponse a été en 2013 :) – anstarovoyt