【发布时间】:2016-05-13 15:06:36
【问题描述】:
基本上,我在 linux 机器上运行一个 java 进程,并且能够使用以下命令捕获 JVM 内存的堆转储,但我认为这可能不是正确的方法,因为我捕获堆的时间可能没有完整且正确的对象状态(它们可能仍在运行,因为进程仍在运行)。
所以我想知道如何获取完整流程执行的堆转储。现在我没有遇到任何内存不足的问题,而是进行故障排除以找出哪些对象正在使用更高的内存或疑似泄漏。
jmap <pid> <filepathtogeneratedheap>
【问题讨论】:
-
如果您的意思是需要对整个执行过程进行某种记录,我建议您使用 Java Mission Control。它与 JDK 捆绑在一起。
-
好的,谢谢。另外,只是想知道如果我们在使用 Jmap 之间生成转储,它不会给出正确的堆内存对象摘要图片,不是吗?
-
实际上我在 Linux 机器上的远程 JVM 上运行我的进程,我只有在那台机器上的读取权限,我不知道 JVM 在那台机器上运行在哪个端口上。如何使用 VisualVM 或 Java Mission Control 记录远程进程而不是在 windows 上?
-
你可以试试jvm-object-inspector,虽然它是实验性的并且有巨大的性能损失
-
使用 Jmap 转储应该为您提供有关已分配堆的正确信息。但是您必须努力将每个转储关联起来以提取趋势或演变。