堆转储中有很多休眠查询。我怎样才能限制?

Dhe*_*rik 6 java hibernate heap-memory heap-dump

我正在处理一个包含数百个休眠实体和EAGER关联的大型应用程序。当我启动这个应用程序时,内存消耗非常高(超过 1 GB)。

查看刚刚启动的应用程序的JVM heap dump,分析了解到,大部分内存被来自应用程序不同实体的char[]不同SELECT语句所占用。

我想 thisSELECT是由 Hibernate 的查询计划缓存生成的。

我想为开发环境限制此缓存的大小。我试图用一些属性来限制大小:

"hibernate.query.plan_cache_max_size", "16" //default is 2048
"hibernate.query.plan_parameter_metadata_max_size", "16" //default is 128
Run Code Online (Sandbox Code Playgroud)

但是内存消耗没有区别。

我应该怎么做来限制 Hibernate 查询的缓存?

我正在使用 Hibernate 5.0.10。

i.m*_*rev 5

确实有很多与“查询计划缓存内存使用情况”相关的问题。( 1 , 2 , 3 , 4 )。但是作为现在的解决方案,我们可以设置一些设置,其中之一 - hibernate.query.plan_cache_max_size。很奇怪,它没有帮助,在我的情况下它起作用了。也许问题隐藏在其他地方。

如果您有堆转储,请尝试使用内存分析器 (MAT) 检查您的假设,运行此 OQL 查询(如果您还没有这样做):

SELECT l.query.toString() FROM INSTANCEOF org.hibernate.engine.query.spi.QueryPlanCache$HQLQueryPlanKey l
Run Code Online (Sandbox Code Playgroud)

它会给你额外的信息。

以防万一。您是否尝试更改所有这些设置的值?

"hibernate.cache.query_cache_factory"
"hibernate.query.plan_cache_max_size"
"hibernate.query.plan_cache_max_soft_references"
"hibernate.query.plan_cache_max_strong_references"
"hibernate.query.plan_parameter_metadata_max_size"
Run Code Online (Sandbox Code Playgroud)