目录
一、参考资料
hibernate QueryPlanCache引发的heap区内存溢出_人生如逆旅,我亦是行人。。。-CSDN博客
记一次OOM排查解决【图文】_zhuwensheng_51CTO博客
记录一次 java内存泄漏的排查 - 我的小时代 - 博客园
问题总结----记一次Jpa In语句QueryPlanCache导致的JVM内存溢出_cyfblog的博客-CSDN博客

记一个内存泄漏问题:Query Plan Cache BoundedConcurrentHashMap占用堆内存_yogima的博客-CSDN博客
二、查阅解决办法
Hibernate 中文文档 | Hibernate 中文网
https://docs.jboss.org/hibernate/orm/5.6/quickstart/html_single/
https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html
QueryPlanCache 内存泄漏解决方法_这就是快乐嘛-CSDN博客
How to improve statement caching efficiency with IN clause parameter padding - Vlad Mihalcea
hibernate.query.plan_cache_max_size=128
hibernate.query.plan_parameter_metadata_max_size=64
这个方案的问题,您可能会损失性能。如果您修复了计划缓存大小,但仍然没有修复填充缓存的实际查询 - 您的所有缓存可能会被该错误查询填充,从而没有空间来缓存其他查询。因此缓存可能大部分时间都在忙于那个糟糕的查询,而其他查询的性能可能会降低, 因为它们没有被正确缓存或过早从缓存中被逐出
三、问题描述
/**
* 根据UID批量查询
* // TODO: 2021/11/19 会产生大量QueryCache缓存
*/
List<BaseUserEntity> findByIdIn(List<Long> ids);
Class Name | Shallow Heap | Retained Heap | Percentage
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
byte[12265] @ 0x92edb390 select generatedAlias0 from BaseUserEntity as generatedAlias0 where generatedAlias0.id in (:param0_0, :param0_1, :param0_2, :param0_3, :param0_4, :param0_5, :param0_6, :param0_7, :param0_8, :param0_9, :param0_10, :param0_11, :param0_12, :param0_13, :param0...| 12,288 | 12,288 | 0.00%
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
重启之前65%堆内存,重启之后20-30%
四、解决方案与效果展示
hibernate.query.in_clause_parameter_padding=true
优化之前
调整参数优化之后