I think we should use ES' BytesRefHash with paging. It will be a bit slower to add stuff into it (deep copy), but the big upside is that the storage behind it will be reused for next requests, which will prevent heap trashing. The paging with BRH is better than the CacheRecycler, since that reuses the entire data structure and not just the storage behind the data structure. So for example a reused paged datastructure doesn't suffer from an expensive  put or get because its capacity is big.