1

我们在 Tomcat 上部署了一个基于 GWT 的应用程序。每隔一天,应用程序就会因 OutOfMemoryException 而崩溃。因此,当应用程序接近使用最大分配内存时,我已经开始对其进行堆转储。

应用程序的行为如下,

  1. 用户登录到应用程序
  2. 输入要使用集群设置在服务器上分析的应用程序的输入。
  3. 客户端每 15 秒轮询一次服务器以获取作业状态并更新 UI 控件。轮询是使用 requestfactory 调用从服务器中提取一些数据来完成的。
  4. 如果工作完成,我们使用弹性表向用户显示结果。大约有 1000 行,6 列。

堆转储,

我们使用 jmap 对 tomcat 进程进行了堆转储,以查看内存中的内容。以下图片是使用带有堆转储的 Eclipse 内存分析器拍摄的。

堆转储概述

统治者树

支配树

扩展的支配树

我们可以看到在堆中保留了大量的 hashmap 条目,保留大小为 25k,其中大约有 600 万个。

问题:

  1. com.google.gwt.core.client.impl.WeakMapping 显示 16 字节的浅堆,但保留的堆几乎是我们为应用程序分配的所有内存。
  2. 是不是因为我们每 15 秒轮询一次服务器并检索以某种方式被引用而不是 GC 的数据。
  3. 我们如何取消引用这些哈希图。
  4. 它与这里提到的场景完全不同吗?

到目前为止,我们在分析应用程序时使用了 jconsole、jprofiler、MAT、jhat。而且我们不知道问题出在哪里。

感谢你的帮助。

4

1 回答 1

3

在主干和 2.4 分支中修复了内存泄漏。WeakMapping

于 2011-07-27T17:32:41.783 回答