【发布时间】:2011-07-27 16:04:11
【问题描述】:
我正在使用 MAT 来比较两个堆转储。我每天都在做一个堆转储,它每天增长大约 200 兆。我认为泄漏与 java.util.zip 相关,因为该表显示的内容以及我们最近添加了一个新进程来压缩和解压缩大量文件。 (见图)
此时我打开支配者并过滤 .Inflater。这产生了大量的 java.util.zip.Inflater 列表。现在我想看看是什么让这些保持开放,所以我选择了一个并运行到 GC 根的路径,不包括弱引用和软引用(见图)。
看起来这与 jar 膨胀有关,与我的流程无关。在这一点上,我被困住了,需要一些建议。
编辑 1
Sean 询问了 ThreadLocals。如果您查看没有过滤器的 dominator_tree,您会看到 java.lang.ApplicationShutdownHooks 占堆的 58%。如果我展开其中一些条目,您会看到它们似乎在 ThreadLocalMap 中。我怎样才能找到把它们放在那里的东西?
编辑 2
肖恩的评论让我走上了正确的道路。我正在使用 Glassfish v 2.0,它有一个 memory leak。它不断创建新的 LogManager 并将它们添加到 ApplicationShutdownHooks 集合中。
我通过打开 ApplicationShutdownHooks 并手动从集合中删除对象来解决此问题。
【问题讨论】:
-
所有实例到 GC 根目录的路径都像这样吗?可能这不是一个有代表性的样本。
-
有 16k 个实例,因此可能有些不同。我看过一些和他们一样的。有谁知道为什么我的图片没有显示?
-
您是否将 ThreadLocal 变量放入哈希表中? 420k ThreadLocal 的活跃度似乎真的很高
-
@Sean - 如果我是,我不知道。但是,我同意它看起来确实很高。事实上,这一切似乎都很高,如果我将每一天与前一天进行比较,它们看起来都很相似,所以有些事情正在失控。
标签: java memory-leaks