JVM heaps can scale up but not down

Jesper Wilhelmsson jesper.wilhelmsson at oracle.com
Thu Aug 21 11:43:41 UTC 2014


Andrew Ash skrev 21/8/14 12:40:
> Hi Jesper,
>
> Many thanks for the extensive answer!
>
> It sounds like with the newer features the scale-down scenario will be possible.
>   Here's how I think it could work from the new features:
>
> 1. Mesos starts a task with X memory of Y memory on a machine
> 2. JVM starts with -Xmx=Y and a MinHeapFree ratio of (X-Y)/Y to keep the max
> actual utilization at X
> 3. Application running in the JVM does work
> 4. Mesos decides to take back memory and sends a message to the app that it
> should shrink to Z memory (Z < X)
> 5. App reduces its memory usage by the appropriate amount
> 6. App signals to the JVM to use a lower MaxHeapFreeRatio and triggers Full GC
> 7. JVM performs Full GC and shrinks heap
> 8. App checks if memory usage is below Z; goto step 5 if not
> 9. App tells Mesos it has shrunk its usage
> 10. Mesos gives the memory to some other task

Seems reasonable.

>
> The Xmx/MinHeapFree calculation in step 2 is to support increasing the memory
> usage up to the maximum of the machine (is Xmx manageable now?).

No, Xmx is not manageable. If the JVM decides that the application needs a 
bigger heap to run with proper performance the heap will grow again. If you want 
to force the heap to stay small you'd probably have to keep a lower 
MaxHeapFreeRatio and be willing to pay with lower performance.

>
> There are some difficulties in step 5 of how the app knows how much memory to
> remove.  In my motivating case (Apache Spark) the app keeps a pool of cached
> data with size estimates, and could potentially drop the appropriate amount of
> data from its cache.  It would require recalculation but that can be streamed
> and never held in a JVM's heap at once.

Well I guess only the app developer knows how much memory the app can release 
and still function properly. If it's a cache then you'd again have to consider 
performance vs memory usage.

>
> The combination of step 6 and step 7 are what the recent JDK feature work will
> make possible.
>
>
> Is this how you envision the scale-down scenario working in practice?

Yes, this is exactly how I envisioned it :)
Let me know if it works out IRL.
/Jesper

>
>
> Many thanks,
> Andrew
>
>
> On Wed, Aug 20, 2014 at 11:47 PM, Jesper Wilhelmsson
> <jesper.wilhelmsson at oracle.com <mailto:jesper.wilhelmsson at oracle.com>> wrote:
>
>     Hi Andrew,
>
>     The flag -XX:MaxHeapFreeRatio was recently made manageable so that you can
>     change its value during runtime. The motivating use case behind that change
>     was exactly the scenario you describe, that you want to force a running JVM
>     to shrink the heap.
>
>     Lowering MaxHeapFreeRatio may decrease performance since it will likely
>     increase garbage collection frequency. The way to use it in a production
>     server would probably be to lower the ratio, force a System.gc to shrink the
>     heap and then increase the ratio again.
>
>     Unfortunately there can never be any guaranties that the heap can shrink
>     unless you force a full GC that compacts the entire heap. The heap has to be
>     allocated as one consecutive memory area and if you're unlucky there can be
>     some long lived object allocated near the top of the heap which makes it
>     impossible to shrink the memory area.
>
>     Recently there has been plenty of work in the G1 collector to deal with this
>     situation. In 8u20 we started sorting the memory regions to increase the
>     chances of allocating long lived objects at the bottom of the heap. In 8u40
>     we will introduce the possibility to decommit memory within the heap. This
>     will make it possible to shrink the heap by cutting out a hole somewhere
>     within the heap rather than being forced to only shrink from the top. This
>     change will most likely be pushed to 8u40 within the next few days, it's
>     already present in the JDK 9 repository.
>
>     These features are all default behavior in G1, so if you haven't already,
>     switch to G1 (-XX:+UseG1GC) and try out the latest bits to see if it solves
>     your problem.
>
>     Best regards,
>     /Jesper
>
>
>     Andrew Ash skrev 21/8/14 00:42:
>
>         // please redirect if this is the wrong list
>
>         Hi JDK devs,
>
>         I'm occasionally in a situation where I have a JVM running and want to tell
>         it to "scale down" to use less heap than its current active set.  This
>         would be in the space between -Xms and -Xmx bounds.  Scaling "up" from -Xms
>         towards -Xmx obviously happens automatically, and I've heard conventional
>         wisdom that you can't decrease heap size on a running JVM, but I've never
>         heard of any work being done to make that possible.
>
>         The use case is when I have a long-running JVM in an Apache Mesos [1]
>         context, and Mesos wants to "take back" some memory resources from a
>         running JVM task.
>
>         Is there any work being done to make scaling down possible?
>
>         Cheers,
>         Andrew
>
>
>         [1] https://mesos.apache.org/
>
>


More information about the jdk9-dev mailing list