<div dir="ltr">
<div>ArrayList, HashMap, and other collections have internal Object[]'s
to store the elements. The Object[]'s are lazily initialized to
minimize heap usage. However, there is still quite a bit of waste in
these Object[]'s. Some collections are oversized from the beginning.
Some collections are filled and then partially or fully emptied.
For an average heap dump, 10.1% of the heap is wasted on oversized
Object[]'s.<br></div><div><br></div><div>These Object[]'s can be trimmed
during GC's move operation but only when the process transitions to
idle.
Since the trimming only happens when the application transitions to
idle, then the extra CPU and/or pause time isn't a concern. The
performance penalty to the application to resize larger won't happen for
a while since the process is idle. With the reduction of heap usage
more idle processes can run on a single VM (i.e., the JVM will be more
Docker Container friendly). <br></div><div><br></div><div></div>The
trimming may apply to other collections such as ArrayDeque, BitSet,
HashSet, IdentityHashMap, LinkedHashMap, Stack, TreeMap, TreeSet,
WeakHashMap, Hashtable, and Vector. HashSet, IdentityHashMap,
LinkedHashMap, TreeMap, and TreeSet may be implemented with HashMap so
trimming HashMap will automatically make these other collections
benefit.<br><div><br></div><div>How did I come up with the 10.1% heap
reduction? I analyzed 650 heap dumps and presented the findings in Java
Memory Hogs. By carefully adding up the right numbers, I calculate
that the heap reduction will be 10.1%.
That's a big savings and it will impact the entire world of Java
programs! <br></div><div><br></div><div>I entertained the idea of having
a setting to trim with every GC or when objects promote from young to
old generation. One concern is that the application would take a
performance penalty to enlarge some or all the Object[]'s. Another
concern is that the extra CPU time and/or pause time will interfere with
the application's performance.<br></div><div><br></div>What do you
think of the overall idea? Do you have ideas of how to trim more often
than when the application transitions to idle?
</div>