网络知识 娱乐 捕获 Java Heap Dumps的7种方法

捕获 Java Heap Dumps的7种方法

{"data":{"title":"捕获 Java Heap Dumps的7种方法","abstract":"您的 Java 应用程序的内存不正常吗?根据错误,这些行业解决方案中至少有一个应该有所帮助heap dump是 Java 虚拟机(JVM)堆中某个时间点上所有对象的快照。JVM 软件从堆中为所有类实例和数组的对象分配内存。","cover":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/f3abd645f217416fafe8052153dd16a9","articleType":"article","itemId":"7112659105696711207","groupId":"7112659105696711207","groupSource":2,"isOriginal":true,"banComment":false,"publishTime":"2022-06-24 12:35","source":"qaseven","tag":"technique","mediaSite":null,"pathname":"/article/7112659105696711207/","loginUserInfo":null,"favorite":false,"relation":{"isFollowing":false,"isFollowed":false},"likeData":{"userLikeStatus":0,"count":1},"isSelf":false,"content":"

您的 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 进程。


步骤:

  1. 启动 jvisualvm 在下面的文件夹
  2. 右键单击其中一个 Java 进程
  3. 单击下拉菜单上的“堆转储”选项
  4. 将生成Heap dump
  5. 生成Heap dump的文件路径将在“摘要”选项卡 > “基本信息”> “文件”部分中指定

图: 从 JVisualVM 捕获堆转储

捕获 Java Heap Dumps的7种方法

5. JMX


有一个 com.sun.management: type = HotSpotDiagnotionMBean。这个 MBean 有“ dump Heap”操作。调用此操作将捕获Heap dump。“ dump Heap”操作有两个输入参数:

  1. outputFile: 应该写入堆转储的文件路径
  2. live: 当传递“ true”时,只捕获堆中的活动对象


您可以使用 JMX 客户机(如 JConsole、 jmxsh、 JavaMissionControl)来调用此 MBean 操作。

捕获 Java Heap Dumps的7种方法

6. Programmatic Approach


您还可以通过编程方式从应用程序捕获dump Heap,而不是使用工具。在某些情况下,您可能希望根据应用程序中的某些事件捕获堆转储。这里有一篇来自 Oracle 的好文章,它提供了从应用程序捕获dump Heap的源代码,方法是调用 com.sun.management: type = HotSpotDiagnomBean JMX Bean,我们在上面的方法中讨论过。

7. IBM 管理控制台

如果应用程序在 IBM WebSphere Application Server 上运行,可以使用管理控制台生成堆。:

步骤:

  1. 启动管理控制台
  2. I 在导航窗格中,单击 Troubleshooting > Java 转储和核心
  3. Select the 选择server_name Server 要为其生成dump Heap的
  4. Click Heap dump 为指定的服务器生成dump Heap

还可以使用 wsadmin 生成dump Heap。

尽管本文提供了多个捕获堆转储的选项,但前三个选项是行业中最常用的选项。



","imageList":["https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/30ea4f6518b747709ba16e282d3ad7c5?from=pc","https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/a51b84b882184a699b6326841e0d7434?from=pc"],"mediaInfo":{"userId":"MS4wLjABAAAA8-6yry9XXyfX7z4WXHRyv9hzDr8Dx8oFTW5HLX2jb6g","unsafeUserId":"70547627105","name":"qaseven","avatarUrl":"https://p26.toutiaoimg.com/origin/tos-cn-i-jcdsk5yqko/fe89d0f5470e4967ae83a0f26c3e3aef","description":"测试专家,擅长敏捷测试,自动化测试,devops等领域","userVerified":1},"seoTDK":{"title":"捕获 Java Heap Dumps的7种方法-今日头条","description":"您的 Java 应用程序的内存不正常吗?根据错误,这些行业解决方案中至少有一个应该有所帮助heap dump是 Java 虚拟机(JVM)堆中某","keywords":"Java,Java虚拟机,美好,一直在身边,软件,虚拟机","publishTimestamp":"1656045347","modifiedTimestamp":"1656050697"},"logId":"202206241439290101310570171389B330","sylpageConfig":{"card":{"id":""}},"identity":{"web_id":"7111199547455817229","user_is_login":false},"abtestInfo":{"rsp_type":5,"version_name":"4252807,4164637","parameters":{"feat_repost_type":{"new":true},"home_nav_conf":{"dcd_out":1},"local_filter":{"core_filter":{"filter_list":{"ms::TicaiFilter":true}}},"page_upgrade":{"new_profile":true,"video_double_column":true},"sati":{"enable_ad_prime":true,"enable_sorter_optimus":true,"prime_rule_rank_version":"toutiao_web","use_toutiao_web_feed":true,"format_max_consecutive_middle":2,"format_max_consecutive_nogroups":3,"enable_reduce_nogroup":true},"seraph":{"score_rule":{"default":{"replace":{"group_util":"_CTR - 1000*dislike"}},"new_user":{"replace":{"group_util":"_CTR - 1000*dislike"}}}},"sort":{"allowed_ticai":["forum_post","pgc_text","pgc_video"]},"video_detail_page_upgrade":{"new_page":true}},"env_flag":0},"localCityInfo":{"name":"北京","code":"110000","channelId":3202164529},"showResearch":false}}