org.hibernate.hql.internal.ast.tree.Node在jmap堆转储中是什么意思

时间:2019-02-01 00:44:49

标签: java hibernate memory-leaks spring-data jmap

我有一个使用spring数据的spring boot应用程序。我有本机查询和查询方法。显然我的应用程序遇到内存问题。我尝试执行jmap -histo来确定使用大量资源的类。

在我的第一个jmap转储中,这是结果(第一天)-重新开始

first

然后是第二天的结果

second

注意org.hibernate.hql.internal.ast.tree.Node开始出现。

然后在第三天 third

org.hibernate.hql.internal.ast.tree.Node的内存大小正在增加。

希望您能帮助我,或者有什么建议吗?由于尚未隔离导致此问题的代码,因此我尚未发布代码。顺便说一句,晚上没有任何操作,所以我希望应该运行垃圾收集。

3 个答案:

答案 0 :(得分:0)

我无法回答是什么原因造成的。但是,将Spring Boot的版本(反过来又将Hibernate版本更新)更新为2.2.1.RELEASE似乎可以为我解决这些问题。

答案 1 :(得分:0)

我也遇到了同样的问题。以下配置可能会有所帮助。

spring:
  jpa:
    properties:
      hibernate:
        query:
          plan_cache_max_size: 64
          plan_parameter_metadata_max_size: 32

答案 2 :(得分:0)

显然,hibernate正在缓存其所有查询,这是为了使hibernate不会重新编译准备好的语句,但是,如果您有动态查询,它将导致内存溢出。

例如:

准备好的声明

Select * from employee where id = :id

->可以,因为休眠将只缓存准备好的语句,但是如果您这样做的话

select * from employee where id = 1
select * from employee where id = 2
select * from employee where id = 3

-> Hibernate将缓存这3条语句,从而导致内存溢出。