1

我不幸得到了一项寻找未经证实的内存泄漏的任务。这是我第一次使用 YourKit,所以虽然我知道我应该寻找什么,但我不知道在哪里寻找以及如何寻找。

我的理解是,随着时间的推移,内存消耗会增加,因为某些对象没有被释放。在 Rails 中很难做到这一点,但我想有人知道怎么做。

以下是内存遥测的样子:

什么趋势!

忽略 GC 之间的事实周期随着时间的推移而增加,看起来 Old Gen 内存正在上升......也许。

现在我们可能需要知道那里堆积了哪些物体以及产生它们的原因。

到目前为止我采取的步骤:

  1. 触发CG
  2. 开始“对象分配记录”(每 100 个......我觉得它可能对某些东西有用)
  3. 等了一会儿
  4. 触发了另一个CG
  5. 做了内存转储

在 YourKit 中打开内存快照后,我不知道我应该寻找什么。

这很糟糕,对吧?

分配中有调用树。展开树给了我一些正在运行的 Rails 代码的提示,但我不知道我所看到的是否真的是我需要的。

wtf我在看

任何 Java 分析,Yourkit 挥舞,能指出我正确方向的人吗?

编辑:我可以在合并路径视图中看到的示例:

在此处输入图像描述

4

1 回答 1

2

1) 不要使用对象分配记录。对于内存泄漏查找几乎没有用处。

2)我建议定期推进对象生成(它非常快并且不会增加开销)。看看http://www.yourkit.com/docs/java/help/generations.jsp

您将能够按“年龄”拆分对象并了解堆增长的原因。

由于您使用的是 Tomcat,因此查看“Web 应用程序”可能会有所帮助http://www.yourkit.com/docs/java/help/web_applications.jsp如果您的应用程序在类重新加载/重新部署方面存在问题,它将是在那里可见。

最好的问候, Vladimir Kondratyev YourKit, LLC

于 2015-01-16T08:05:39.303 回答