如果应用程序在GC中,如何可靠地进行JVM核心转储?

我试图find我的Java应用程序中的内存泄漏的原因。 我需要为一个 GC循环的进程获取一个堆转储。 在这种情况下,Jmap不起作用,因为应用程序被挂起,而且堆栈非常大。

不幸的是,jmap抛出了我所取得的核心转储的UnknownOopException。 我想在GC中采取核心转储是不正确的。 有没有什么办法来暂停Java进程的地方,采取核心转储将是正确的?

还是我完全错了,由于其他一些问题而破坏了核心转储?

执行GC时不能进行堆转储。 您需要在GC之前或之后进行堆转储。 如果你想知道为什么要花这么长时间,那么确定哪一个花费这么长时间是值得的。 要看到这个添加-verbosegc这将指示是否需要很长时间才能达到安全点,复制对象,扫描tenrured空间,检查引用或别的东西。

它可能会随着时间的推移,因为你有很多的对象来清理。 作为一种猜测,每2GB堆对象可能会花费大约1秒的时间。

你需要做的是在堆接近完全堆满应用程序之前进行堆转储。

根据我的经验,OutOfMemory异常或长的GC周期并不表示某些内存泄漏。

为了搜索内存泄漏,分开一段时间(我已经使用jvisualvm,现在有一个版本与JDK捆绑在一起)进行2次单独的堆转储并分析它们。 提示:检查保留对象的大小有帮助。

根据你的应用程序的作用,如果一个明显的内存泄漏没有出现,调整JVM GC选项是最好的选择。 寻找世代比例,新世代后的世代等等。

希望这个对你有帮助。