The root problem was memory fragmentation, as Hans indicated in his comment. During the creation of the our cached object (rather big ones), we had a many mid sized transient objects creating gaps among the big permanent objects. As soon as we reduced the amount of transient objects by reuse, the fragmentation dropped radically.
As you can see on the graphs, the ratio of used : unused space was 1:2. After the modification the ratio is 8:1.