我试图在我的 java 应用程序中找到内存泄漏的原因。我需要为处于 长 GC 循环中的进程获取堆转储。 Jmap 在这种情况下不起作用,因为应用程序被挂起并且因为堆非常大。
不幸的是,jmap 在我获取的核心转储上抛出 UnknownOopException。我认为在 GC 期间进行核心转储是不正确的。有没有办法在进行核心转储正确的时候暂停 java 进程?
还是我完全错了,因为其他问题导致核心转储损坏?
最佳答案
在执行 GC 时不能进行堆转储。您需要在 GC 之前或之后进行堆转储。如果您想知道为什么需要这么长时间,那么确定哪个阶段需要这么长时间是很有用的。要查看此添加 -verbosegc
这将指示是否需要很长时间才能到达安全点、复制对象、扫描 Tenrured 空间、检查引用或其他内容。
这可能需要很长时间,因为您有很多对象需要清理。估计最坏情况下,每 2 GB 堆对象可能需要 1 秒。
关于java - 如果应用程序在 GC 中,如何可靠地获取 JVM 核心转储?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13934547/