When rendering with thousands of users, we are seeing large buffers being left in memory and not released.
When Java goes to garbage collect, the buffers are not being release due to references to these buffers being held. This is described in
JS2-800. Combining this fix with JS2-800 should enable the garbage collector to properly free up these per request buffers.
Looking at heap dump, we can see:
1,308,968,904 (81%)  4 org/apache/jetspeed/container/window/impl/PortletWindowAccessorImpl 0x5a459e98
1,308,968,864 (81%)  4 java/util/Collections$SynchronizedMap 0x5a459ee8
1,308,968,752 (81%)  3 java/util/HashMap 0x5a459eb8
1,308,968,688 (81%) [81,320] 20,326 array of java/util/HashMap$Entry 0xaf52a080
The above problem is addressed in
JS2-800, where we can limit the number of PortletWindows in memory
Combined with too many portlet windows in memory, the portlet content render buffers are held on to, and never released.
This bug fix aids the garbage collection algorithm by "releasing" the buffers upon render completion
Note I have seen some very large buffers held on to and never released.
By setting the streams to null, we can try to aid the garbage collection into freeing these buffers