【发布时间】:2015-05-10 19:52:24
【问题描述】:
我正在开发一个在 Tomcat 上运行的 Java Spring - Hibernate Web 应用程序。由于应用程序的性质,我在开发的其他应用程序上遇到了以前从未遇到过的内存/堆问题。 我的应用程序是一种分析网络工具,它管理大量数据,大多数时候这些数据最终使用 Highcharts(用于网络图表的 JavaScript 库,参考 here)绘制在表示层中。 当我第一次开始在 Tomcat 上测试它时,它在第二次请求后崩溃了,从那以后我一直在跟踪内存使用情况。我不是 Tomcat 方面的专家,但我相信问题可能出在垃圾收集器上。 NetBeans 8.1 带来了一个内存分析器,它在我的应用程序上运行时显示以下内容:
您可以看到消耗的内存量非常高,考虑到它与一个用户打交道。每次我提出请求时,您都可以清楚地看到内存的增加。一旦请求完成并且页面加载了所有图表,使用的内存会下降一点,但它永远不会下降到接近 0。更重要的是,在每次请求之后,内存都会下降一个更高的点,这使得它在很长一段时间内不可持续学期。 正如您在下面的 Firebug 屏幕截图中看到的那样,通过 ajax 调用发送到浏览器的数据量并没有那么大:
从服务器发送 1.7 MB 需要 4.5 秒,涉及数据库访问和其他域操作。正如您在 Firebug 中看到的,有几个 ajax 调用,它们中的每一个都属于一个 Highcharts 图表。 我相信垃圾收集器无法正常工作,但我不确定。所有 JVM 和 Tomcat 配置都是默认配置。 你怎么看?
编辑: 我检查了我所有的数据库访问,我确信连接得到了适当的处理。关于会话数据,存储的数据不多,并且在每次请求时都会被覆盖(我的应用程序作为报告应用程序工作,因此每次报告执行的所有会话数据都会在下一次请求时被覆盖)。
【问题讨论】:
-
我认为我们应该评估您是如何定义项目的,以查看您是否将数据存储在 GC 无法释放的地方,从而产生内存泄漏。此信息不足以确定问题是由您的应用程序还是由 Tomcat 引起的。
-
如果你告诉我你需要什么,我可以发布更多信息。顺便说一句,我已经编辑了我的帖子。
-
你永远不会告诉对象它们是空闲的,所以它们认为它们仍在被使用并且不能被垃圾收集。此外,在 tomcat 的管理面板上,您可以手动进行垃圾收集,因此如果是 tomcat 或您的应用程序导致内存问题,请尝试缩小范围。
-
Java 应该处理这个问题。
-
@Hauri “那个”是什么?如果 java 认为你仍在使用一个对象,它将不会收集该对象。
标签: java tomcat memory-management highcharts garbage-collection