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

3
我有一个使用Spring Data的Spring Boot应用程序。我有本地查询和查询方法。显然,我的应用程序面临着内存问题。我尝试执行jmap -histo来确定使用大量资源的类。
首次执行jmap转储时(第一天)-刚开始: first 然后是第二天的结果: second 请注意,org.hibernate.hql.internal.ast.tree.Node开始出现。
接着是第三天的结果: third org.hibernate.hql.internal.ast.tree.Node在内存中的大小正在增加。
希望你能帮助我,或者提供任何建议?我还没有发布代码,因为我还没有确定导致这个问题的代码。顺便说一下,晚上没有任何操作,所以我期望垃圾回收应该运行。

2
你解决了吗?我遇到了类似的行为。 - Gabi
3个回答

1
我也遇到了相同的问题。以下配置可能有所帮助。
spring:
  jpa:
    properties:
      hibernate:
        query:
          plan_cache_max_size: 64
          plan_parameter_metadata_max_size: 32

0

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

例如:

准备好的语句

Select * from employee where id = :id

-> 这是可以的,因为Hibernate将只缓存预处理语句,但如果您做了这样的事情

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

-> Hibernate 会缓存这3个语句,因此可能会导致内存溢出。


0

我无法回答是什么原因导致了这个问题。然而,将Spring Boot的版本(进而更新了Hibernate版本)更新到2.2.1.RELEASE似乎为我解决了这些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接