Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java heap keeps on shrinking! What is happening in this graph of heap size?

This is a screen shot of a JVM (win64, 6u17) running ActiveMQ, after every garbage collection the heap size is reducing. As the heap size reduces garbage collection gets more frequent and the heap reduces more quickly. Eventually the VM locks up as it's spending all it's time in GC.

-Xms is the default and -Xmx is 2048mb.

What is happening!!? How can I avoid this?

http://imagebin.org/92614

Shrinking heap http://imagebin.org/index.php?mode=image&id=92614

n.b originally posted on serverfault.com, moved to stackoverflow.com as requested

like image 583
chillitom Avatar asked Dec 10 '22 16:12

chillitom


1 Answers

Google found me the following, from the IBM JVM FAQ (how's that for an NLA):

When does the Java heap shrink?

Heap shrinkage occurs when GC determines that there is a lot of free heap storage, and releasing some heap memory is beneficial for system performance. Heap shrinkage occurs after GC, but when all the threads are still suspended.

The Sun JVM does something similar. Below is an excerpt from an Oracle Technology Network article entitled Ergonomics in the 5.0 Java Virtual Machine.

The heap will grow or shrink to a size that will support the chosen throughput goal. Some oscillations in the size of the heap during initialization and during a change in the application's behavior can be expected.

...

It is typical that the size of the heap will oscillate as the garbage collector tries to satisfy competing goals. This is true even if the application has reached a steady state. The pressure to achieve a throughput goal (which may require a larger heap) competes with the goals for a maximum pause time and a minimum footprint (which both may require a small heap).

I suggest you have a look at the rest of that document; it may have more information relevant to your problem.

like image 121
Thomas Avatar answered Dec 14 '22 23:12

Thomas