我们在 Tomcat 上部署了一个基于 GWT 的应用程序。每隔一天,应用程序就会因 OutOfMemoryException 而崩溃。因此,当应用程序接近使用最大分配内存时,我已经开始对其进行堆转储。
应用程序的行为如下,
- 用户登录到应用程序
- 输入要使用集群设置在服务器上分析的应用程序的输入。
- 客户端每 15 秒轮询一次服务器以获取作业状态并更新 UI 控件。轮询是使用 requestfactory 调用从服务器中提取一些数据来完成的。
- 如果工作完成,我们使用弹性表向用户显示结果。大约有 1000 行,6 列。
堆转储,
我们使用 jmap 对 tomcat 进程进行了堆转储,以查看内存中的内容。以下图片是使用带有堆转储的 Eclipse 内存分析器拍摄的。
我们可以看到在堆中保留了大量的 hashmap 条目,保留大小为 25k,其中大约有 600 万个。
问题:
- com.google.gwt.core.client.impl.WeakMapping 显示 16 字节的浅堆,但保留的堆几乎是我们为应用程序分配的所有内存。
- 是不是因为我们每 15 秒轮询一次服务器并检索以某种方式被引用而不是 GC 的数据。
- 我们如何取消引用这些哈希图。
- 它与这里提到的场景完全不同吗?
到目前为止,我们在分析应用程序时使用了 jconsole、jprofiler、MAT、jhat。而且我们不知道问题出在哪里。
感谢你的帮助。