Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Escape analysis in Java

As far as I know the JVM uses escape analysis for some performance optimisations like lock coarsening and lock elision. I'm interested if there is a possibility for the JVM to decide that any particular object can be allocated on stack using escape analysis.

Some resources make me think that I am right. Is there JVMs that actually do it?

like image 675
Denis Bazhenov Avatar asked Apr 21 '09 07:04

Denis Bazhenov


People also ask

What is escaping variables?

Escaping Variable. Technically escaping means “cannot be stored in a register”. In C Large values (arrays, structs). Variables whose address is taken.

What is escape analysis in Golang?

Escape Analysis: Gc compiler does global escape analysis across function and package boundaries. It checks a memory that it really needs to be allocated at a heap or it could be managed within a stack itself.


1 Answers

With this version of java -XX:+DoEscapeAnalysis results in far less gc activity and 14x faster execution.

$ 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 

Without escape analysis,

$ 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 

With escape analysis,

$ java -server -verbose:gc -XX:+DoEscapeAnalysis EscapeAnalysis start [GC 896K->102K(5056K), 0.0055600 secs] 10000000 

The execution time reduces significantly with escape analysis. For this the loop was changed to 10e9 iterations,

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); } 

Without escape analysis,

$ time java -server EscapeAnalysis start 1000000000  real    0m27.386s user    0m24.950s sys     0m1.076s 

With escape analysis,

$ time java -server -XX:+DoEscapeAnalysis EscapeAnalysis start 1000000000  real    0m2.018s user    0m2.004s sys     0m0.012s 

So with escape analysis the example ran about 14x faster than the non-escape analysis run.

like image 130
Janek Bogucki Avatar answered Sep 21 '22 23:09

Janek Bogucki