After a QueryPlanCache.cleanup() the cache still retains a lot of memory (~500MB), but it should be empty. I empty the cache using the *entityManager *as follows:
SessionFactory sessionFactory = entityManager.unwrap( Session.class ).getSessionFactory();
((SessionFactoryImpl) sessionFactory).getQueryPlanCache().cleanup();
After the cleanup I did a heapdump and notices that the segments tables were cleared but the evictions LIRS header was not, causing the memory leak issue. From the LIRS source code, only the accessQueue is cleared: org\hibernate\internal\util\collections\BoundedConcurrentHashMap.java (line 1096):
@Override
public void clear() {
accessQueue.clear();
}
Heapdump screenshot in Eclipse MAT: |