在本文中,我将教您多种捕获 Java 堆转储的方法。 对于优化内存消耗至关重要,堆转储被描述为 Java 进程的内存打印。
Java 堆转储是诊断与内存相关的问题的重要对象,这些问题包括java.lang.OutOfMemoryError
,垃圾收集问题和内存泄漏(缓慢),这些都是 Java Web 开发的一部分。
为了清楚起见,在进行快照的瞬间,堆转储包含诸如 Java 类和堆中的对象之类的信息。
可以帮助您分析堆转储的工具包括 Heap Hero 和 Eclipse MAT 。 但是,您仍然需要为工具提供在正确的时间和正确格式下捕获的堆转储。
1. jmap –XX:+HEAPDUMPONOUTOFMEMORYERROR
值得注意的是,jmap
会将堆转储打印到特定的文件位置。jmap
工具通常打包在 JDK 中。 您可以在以下文件夹中找到它:<JAVA_HOME>\bin
。
要调用jmap
,请执行以下过程。
jmap -dump: live, file=<file-path> <pid>
,其中pid
是 Java 进程 ID,将为其捕获堆转储。此外,file-path
是其中打印堆转储的文件路径。
请注意,传递“实时”选择至关重要。 如果选项“通过”,则只会将活动对象写入堆转储文件。 但是,如果您无法通过该选项,则所有对象(包括未设置为垃圾收集的对象)都将被打印到堆转储中。 这样的错误会过多且不必要地增加其堆转储的大小。 通过将您的移动开发需求与 Java Development Company 签订合同,可以避免此类错误。
2. HeapDumpOnOutOfMemoryError
当应用程序遇到java.lang.OutOfMemoryError
时,捕获瞬时堆转储至关重要。
这样的过程将有助于确定内存中占用的对象以及它们在java.lang.OutOfMemoryError
发生时的位置所占用的空间量(百分比)。
但是,由于操作和技术很多,操作组可能无法捕获堆转储。 此外,团队可能还重新启动了该应用程序。 因此,堆转储捕获已成为系统应用程序的关键方面,尤其是在涉及内存问题时。
幸运的是,XX:+HeapDumpOnOutOfMemoryError
选项将在该过程中提供帮助。 您只需在应用程序启动时传递系统属性(XX:+HeapDumpOnOutOfMemoryError
)。 然后, JVM 将通过在 JVM 面临OutOfMemoryError
的确切时间捕获堆转储来完成其余工作。
值得注意的是,在上述情况下将捕获的头转储将打印在名为-XX:HeapDumpPath
的系统属性概述的位置中
3. jcmd
jcmd
工具用于发送命令请求以诊断 Java JVM 。 同样,jcmd
工具包含在 JDK 软件包中。 您可以在名为bin
的文件夹中获取它。
这是调用jcmd
时需要使用的过程;
- 转到
jcmd <pid> GC.heap_dump <file-path>
- 其中
pid
:是一个 Java 进程 ID,将为其捕获堆转储 - 另外,
file-path
是在其中打印堆转储的文件路径。
结论
在本文中,我讨论了可用于捕获 Java 堆转储的三个主要过程:(1)jmap –XX:+HEAPDUMPONOUTOFMEMORYERROR
(2)HeapDumpOnOutOfMemoryError
和(3)jcmd
。