Search code examples
javascalajvmescape-analysis

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?


Solution

  • 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