jmap - histo 和堆操作是否会给 jvm 带来开销?

jmap - Does histo & heap operation bring overhead to jvm?

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

如果内存敏感 Java 进程处于 OutOfMemory 的边缘(例如,大约 96% 的堆已满,并且无法通过 full 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 堆可能需要几秒钟。