Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Experiences with escape analysis enabled on the JVM

I've just tried the -XX:+DoEscapeAnalysis option enabled on a jdk6-u18 VM (on solaris) and had a rather disappointing experience. I'm running a scala application which has rather a lot of actors (20,000 of them). This is a recipe for garbage-creation!

Typically the app can run with 256Mb of heap but generates huge amounts of garbage. In its steady state it:

  • spends 10% of time in GC
  • generates >150Mb of garbage in <30s which then gets GC'd

I thought that escape analysis might help so I enabled the option and re-ran the app. I found that the app became increasingly unable to clear away the garbage it had collected until it seemed eventually to spend the entire time doing GC and the app was "flatlining" at its full allocation.

At this point I should say that the app did not throw a OutOfMemoryError which I would have expected. Perhaps JConsole (which I was using to perform the analysis) does not properly display GC stats with this option on (I'm not convinced)?

I then removed the option and restarted and the app became "normal" again! Anyone have any idea what might be going on?

like image 418
oxbow_lakes Avatar asked Feb 01 '10 20:02

oxbow_lakes


3 Answers

1 Did the escape analysis show up as being enabled in JConsole? You need make sure you're running the VM with the -server option. I assume you had this working, but I just thought I'd check.

2 I don't think escape analysis will help the situation with Scala Actors. You might see a big gain if you do something like:

def act():Unit = {
   val omgHugeObject = new OMGHugeObject();
   omgHugeObject.doSomethingCrazy();
 }

In the example above the EscapeAnalysis would make it so omgHugeObject could be allocated on the stack instead of the heap and thus not create garbage. I don't think it is likely that the escape analysis will help with actors. Their references will always "escape" to the actor subsystem.

3 Are you on the most recent release of Scala? There was a memory leak that I believe was fixed in a recent version. This even caused Lift to spawn off its own Actor library that you might look into.

4 You might try the G1Garbage collector You can enable it with:

-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

like image 97
Steve g Avatar answered Nov 04 '22 11:11

Steve g


from the jdk-u18 release notes:

Note that Escape analysis-based optimization (-XX:+DoEscapeAnalysis) is disabled in 6u18. This option will be restored in a future Java SE 6 update.

like image 27
llemieng Avatar answered Nov 04 '22 12:11

llemieng


I suggest you try to increase the new generation size, e.g. -XX:NewSize=96M XX:NewRatio=3. Use JVisualVM (included in the JDK), with the Visual GC Plugin to watch how the young and old spaces are utilised.

like image 40
retronym Avatar answered Nov 04 '22 11:11

retronym