正如标题所述,jmap -histojmap -heap 分别给 jvm 带来了多少开销?

如果内存敏感的 Java 进程处于 OutOfMemory 的边缘(例如,大约 96% 的堆已满,并且不能被完整的 gc 清除),是否有可能通过其中一个操作将 jvm 带到 OutOfMemory?

最佳答案

jmap -histojmap -heap 的工作方式不同:jmap -histo 使用动态附加机制,而 jmap -heap 通过 HotSpot Serviceability Agent 工作。差异描述为 here

因此,jmap -histo 由 JVM 本身执行,但 jmap -heap 运行在工具进程中,而 JVM 进程处于挂起状态。在这两种情况下,都不会创建新的 Java 对象,该工具不会导致 OutOfMemoryError

在这两种情况下,应用程序线程都会停止:jmap -histo 停止 Java 线程,jmap -heap 停止整个 JVM 进程。暂停的持续时间可能相当长,尤其是对于大堆。例如。遍历 4GB 堆可能需要几秒钟。

10-08 17:17