捕获Java堆转储的前3种方法
在这篇文章中,我将教我们多种捕获java堆转储的方法。对于内存消耗优化来说,堆转储被描述为Java进程的内存打印。
Java堆转储是诊断内存链接问题的基本对象,包括
java.lang.OutOfMemoryError
、垃圾回收问题和内存泄漏(慢),这些都是javaweb开发的一部分。
为了清楚起见,堆转储包含在获取快照的瞬间堆中的Java类和对象等信息。
可以分析堆转储的工具包括heaphero和eclipsemat。但是,我们仍然需要为工具提供在正确的时间和正确的格式捕获的堆转储。
1. jmap–XX:+heapdumponoutofmemory错误
值得注意的是,jmap将把堆转储打印到特定的文件位置。jmap工具通常打包在JDK中。我们可以在以下文件夹中找到它:<JAVA_HOME>\bin。
要调用jmap,请遵循以下过程。
jmap -dump: live, file=<file-path> <pid>
其中
pid
是Java进程Id,将为其捕获堆转储
还有,这个
file-path
是打印堆转储的文件路径。
注意通过“现场”选择至关重要。当选项将被“传递”时,我们只会将活动对象写入堆转储文件。但是,如果未能通过该选项,则所有对象(包括未设置为垃圾回收的对象)都将打印到堆转储。这样的错误会过度且不必要地增加堆转储的大小。我们可以通过将移动开发需求承包给Java开发来避免此类错误。
2. 堆转储自动内存错误
在应用程序遇到java.lang.OutOfMemoryError.
这样一个过程将有助于确定内存中占用的对象以及它们在发生事件时所占用的空间量(百分比)java.lang.OutOfMemoryError.
但是,由于许多操作和技术问题,操作组可能无法捕获堆转储。此外,团队可能还重新启动了应用程序。因此,堆转储捕获成为系统应用程序的一个关键方面,特别是在涉及内存问题时。
幸运的是,XX:+HeapDumpOnOutOfMemoryError选项在这个过程中会有帮助。我们只需要在应用程序启动时传递系统属性(XX:+HeapDumpOnOutOfMemoryError)。然后,JVM将在JVM遇到OutOfMemoryError时捕获堆转储来完成剩下的工作。
值得注意的是,在上述情况下将捕获的头转储将打印在名为'-XX:HeapDumpPath'的系统属性概述的位置
3. jcmd
jcmd工具用于发送命令请求以诊断javajvm。同样,jcmd工具也包含在JDK包中。我们可以在名为\bin的文件夹中获取它。
下面是调用jcmd时需要使用的过程;
jcmd <pid> GC.heap_dump <file-path>
pid:是一个Java进程Id,将为其捕获堆转储
另外,file path:是打印堆转储的文件路径。