正如标题所述,jmap -histo
和 jmap -heap
分别给 jvm 带来了多少开销?
如果内存敏感的 Java 进程处于 OutOfMemory
的边缘(例如,大约 96% 的堆已满,并且不能被完整的 gc 清除),是否有可能通过其中一个操作将 jvm 带到 OutOfMemory?
最佳答案
jmap -histo
和 jmap -heap
的工作方式不同:jmap -histo
使用动态附加机制,而 jmap -heap
通过 HotSpot Serviceability Agent 工作。差异描述为 here 。
因此,jmap -histo
由 JVM 本身执行,但 jmap -heap
运行在工具进程中,而 JVM 进程处于挂起状态。在这两种情况下,都不会创建新的 Java 对象,该工具不会导致 OutOfMemoryError
。
在这两种情况下,应用程序线程都会停止:jmap -histo
停止 Java 线程,jmap -heap
停止整个 JVM 进程。暂停的持续时间可能相当长,尤其是对于大堆。例如。遍历 4GB 堆可能需要几秒钟。