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

What does org.hibernate.hql.internal.ast.tree.Node means in jmap heap dump

我有一个 spring 启动应用程序使用了 spring 数据。我有本地查询和查询方法。显然我的应用程序面临内存问题。我尝试执行 jmap -histo 以确定使用大量资源的 class。

这是我的第一个 jmap 转储的结果(第一天)-全新开始

然后第二天就是这个结果

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

然后第三天

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

希望你能帮助我,或者有什么建议?我没有发布代码,因为我还没有隔离导致此问题的代码。顺便说一句,晚上没有操作所以我期待垃圾收集应该 运行.

我无法回答是什么原因造成的。但是,将 Spring Boot 的版本(这又更新了 Hibernate 版本)更新到 2.2。1.RELEASE 似乎为我解决了这些问题。

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

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

显然,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 个语句,因此内存溢出。