Java / Tomcat 未使用垃圾回收

Java / Tomcat not using garbage collection

我正在开发 Java Spring - 在 Tomcat 上运行的 Hibernate 网络应用程序。由于应用程序的性质,我遇到了 memory/heap 以前在我开发的其他应用程序上从未遇到过的问题。 我的应用程序是一种分析网络工具,它管理大量数据,这些数据大多数时候最终使用 Highcharts(Java网络图表脚本库,参考 here)绘制在表示层中。 当我第一次开始在 Tomcat 上测试它时,它在第二次请求后崩溃了,从那以后我一直在跟踪内存使用情况。我不是 Tomcat 方面的专家,但我相信问题可能出在垃圾收集器周围。 NetBeans 8.1 带来了一个内存分析器,当我的应用程序 运行 时显示以下内容:

如您所见,考虑到它只处理一个用户,消耗的内存量确实很高。你可以清楚地看到我每次请求时内存的增加。一旦请求完成并且页面充满了所有图表,使用的内存会下降一点点,但它永远不会下降到接近 0。更重要的是,在每次请求之后,内存都会下降一个更高的点,使得它在长期内不可持续学期。 正如您在下面的 Firebug 屏幕截图中看到的那样,通过 ajax 调用发送到浏览器的数据量并不大:

从服务器发送 1.7 MB 需要 4.5 秒,涉及数据库访问和其他域操作。正如您在 Firebug 中看到的那样,有几个 ajax 调用,每个调用都属于 Highcharts 图表。 我相信垃圾收集器工作不正常,但我不确定。所有 JVM 和 Tomcat 配置都是默认配置。 你怎么看?

编辑: 我检查了我所有的数据库访问,我确信连接得到了适当的处理。关于会话数据,存储的数据不多,每次请求都会被覆盖(我的应用程序用作报表应用程序,因此每次报表执行的所有会话数据都会在下一个请求时被覆盖)。

在处理这个问题 48 小时后,我想我找到了问题所在:由于静态方法和变量管理不善导致的内存泄漏。虽然这对我来说是特殊情况,但我认为一些帮助我使用 NetBeans 探查器的参考可以帮助其他人:

NetBeans profile

Whosebug post with tutorial

希望对其他人有所帮助!