<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>