您的 Java 应用程序的内存不正常吗?根据错误,这些行业解决方案中至少有一个应该有所帮助
heap dump是 Java 虚拟机(JVM)堆中某个时间点上所有对象的快照。JVM 软件从堆中为所有类实例和数组的对象分配内存。
heap dump是诊断内存相关问题(如缓慢的内存泄漏、垃圾收集问题和 java.lang)的重要工件。输出记忆错误。它们也是优化内存消耗的重要工件。
有一些很棒的工具,比如 EclipseMAT 和 HeapHero,可以用来分析堆转储。但是,您需要为这些工具提供以正确格式捕获的堆转储。本文提供了捕获堆转储的多个选项。
1. jmap
Jmap 将堆转储打印到指定的文件位置。这个工具打包在 JDK 中。它可以在垃圾箱文件夹中找到。
下面是调用 jmap 的方法:
brwherebrpid: is the Java Process Id, whose heap dump should be capturedbrfile-path: is the file path where heap dump will be written in to.
例如:
jmap -dump:format=b,file=/opt/tmp/heapdump.bin 37320br
注意: 通过“ live”选项非常重要。如果传递了此选项,那么只有内存中的活动对象被写入堆转储文件。如果不传递此选项,则所有对象,甚至是准备进行垃圾回收的对象都将打印到堆转储文件中。它将显著增加堆转储文件的大小。这也会使分析变得乏味。要解决内存问题或优化内存,只需要“活动”选项就足够了。
2. HeapDumpOnOutOfMemory 错误
当应用程序使用 java.lang 时。OutOfMemory 错误,理想的做法是在那个时候捕获堆转储来诊断问题,因为您想知道哪些对象位于内存中,以及在 java.lang 时它们占用的内存百分比。发生 OutOfMemory 错误。但是,由于当时情况紧急,大多数情况下,IT/运营团队忘记捕获堆转储。不仅如此,他们还重新启动了应用程序。如果不在正确的时间捕获堆转储,诊断任何内存问题都是极其困难的。这就是这个选项非常方便的地方。当您在应用程序启动过程中传递‘-XX: + HeapDumpOnOutOfmemyError’系统属性时,JVM 将在 JVM 出现 OutOfMemory 错误时捕获堆转储。
用法示例:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp/heapdump.bin
注意: 捕获的heap dump将在‘-XX: HeapDumpPath’系统属性指定的位置打印。
最佳实践: 始终保持在所有应用程序中配置此属性,因为您永远不知道什么时候会发生 OutOfMemory 错误。
3. jcmd
Jcmd 工具用于向 JVM 发送诊断命令请求。它被打包为 JDK 的一部分。它可以在垃圾箱文件夹中找到。
下面是您应该如何调用 jcmd:
jcmd GC.heap_dump brwherebrpid: is the Java Process Id, whose heap dump should be capturedbrfile-path: is the file path where heap dump will be written in to.
例如:
1 jcmd 37320 GC.heap_dump /opt/tmp/heapdump.binbr
4. JVisualVM
JVisualVM 是一个打包在 JDK 中的监视和故障排除工具。当您启动这个工具时,您可以看到在本地机器上运行的所有 Java 进程。您还可以使用此工具连接到在远程计算机上运行的 Java 进程。
步骤:
- 启动 jvisualvm 在下面的文件夹
- 右键单击其中一个 Java 进程
- 单击下拉菜单上的“堆转储”选项
- 将生成Heap dump
- 生成Heap dump的文件路径将在“摘要”选项卡 > “基本信息”> “文件”部分中指定
图: 从 JVisualVM 捕获堆转储
5. JMX
有一个 com.sun.management: type = HotSpotDiagnotionMBean。这个 MBean 有“ dump Heap”操作。调用此操作将捕获Heap dump。“ dump Heap”操作有两个输入参数:
- outputFile: 应该写入堆转储的文件路径
- live: 当传递“ true”时,只捕获堆中的活动对象
您可以使用 JMX 客户机(如 JConsole、 jmxsh、 JavaMissionControl)来调用此 MBean 操作。
6. Programmatic Approach
您还可以通过编程方式从应用程序捕获dump Heap,而不是使用工具。在某些情况下,您可能希望根据应用程序中的某些事件捕获堆转储。这里有一篇来自 Oracle 的好文章,它提供了从应用程序捕获dump Heap的源代码,方法是调用 com.sun.management: type = HotSpotDiagnomBean JMX Bean,我们在上面的方法中讨论过。
7. IBM 管理控制台
如果应用程序在 IBM WebSphere Application Server 上运行,可以使用管理控制台生成堆。:
步骤:
- 启动管理控制台
- I 在导航窗格中,单击 Troubleshooting > Java 转储和核心
- Select the 选择server_name Server 要为其生成dump Heap的
- Click Heap dump 为指定的服务器生成dump Heap
还可以使用 wsadmin 生成dump Heap。
尽管本文提供了多个捕获堆转储的选项,但前三个选项是行业中最常用的选项。