最近我们的微服务“生活”在 Kubernetes 上的 pod 上,由于堆内存不足相关问题而失败。到那时没问题,我们提供了更多资源,一切都按预期进行。鉴于这一事件,我们开始采取一些堆转储来分析它们并检查根本原因可能是什么。
一切都与流口水有关,这就是我们使用 VisualVM 检查对象内存使用情况的原因:
在 MVELCompilationUnit 下有将近 50.000 个对象引用 org.drools.core.base.mvel.MVELCompilationUnit#1 , org.drools.core.base.mvel.MVELCompilationUnit#2......50.000
这有意义吗?
此时值得一提的是,我们的项目 atm 使用了将近 1000 条通过外部 kjar 加载的规则。 通过执行触发所有规则的操作并随后执行手动 GC 来使用 VisualVM 进行分析不会显示任何问题,因为堆内存随后会被清理。
另外关于我们的代码 atm:
我们使用有状态的流口水会话,为每个用户创建一个 KiesSession,它触发所有规则两次,并在其旅程结束时被处置。
So.. 你认为这实际上是内存泄漏吗? 我们如何进一步调查它? 我们应该使用不同的实例化/触发规则的方法吗?也许会话池可以提供帮助?
提前致谢。