2011-07-27 105 views
8

我正在使用MAT来比较两个堆转储。我每天都在堆转储,每天增长大约200兆。我认为泄漏与java.util.zip有关,因为表格显示的是什么,也因为我们最近添加了一个新的过程,它可以对许多文件进行压缩和解压缩。 (见图片)我需要帮助找到我的内存泄漏使用MAT

Heap dump histogram compare

在这一点上,我打开支配并过滤。 Inflater。这产生了一个大的java.util.zip.Inflater列表。现在我想看看这些开放的东西是什么,所以我选择了一个并运行GC根目录(不包括弱和软引用)(参见图片)。

GC Root

它看起来像这样具有与罐子通货膨胀和无关,与我的过程中做。在这一点上我卡住了,需要一些建议。

编辑1

肖恩被问及ThreadLocals。如果你看看没有过滤器的dominator_tree,你会发现java.lang.ApplicationShutdownHooks是堆的58%。如果我展开其中的一些条目,您可以看到它们似乎位于ThreadLocalMap中。我将如何找到将它们放在那里的东西?

enter image description here

EDIT 2

肖恩的评论把我正确的轨道上。我使用的是Glassfish v 2.0,它有一个memory leak。它不断创建新的LogManagers并将它们添加到ApplicationShutdownHooks集合中。

我通过破解ApplicationShutdownHooks并手动删除集合中的对象来解决这个问题。

+0

所有到GC根的实例路径是这样的吗?这可能是这不是一个有代表性的样本。 –

+0

有16k个实例,所以有可能有些不同。我看过几个,他们也是一样的。有谁知道为什么我的图像没有显示? – Preston

+0

他们对我来说很好。 –

回答

0

肖恩的评论让我走上了正确的轨道。我使用的是Glassfish v 2.0,它有内存泄漏。它不断创建新的LogManagers并将它们添加到ApplicationShutdownHooks集合中。

我通过破解ApplicationShutdownHooks并手动删除集合中的对象来解决这个问题。