如何生成dump文件,dump so文件

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary前言在日常开发中,即使代码写得

这篇文章包含在Github精选中。欢迎您star:https://github.com/yehongzhi/learningsummary

前言

在日常开发中,无论您多么仔细地编写代码,都不可避免地会发生各种意外事件,例如服务器内存突然增加或内存不足溢出(OOM)。遇到这种情况,该如何排查并分析原因呢?

现在我们来谈谈本文描述的转储文件。

什么是dump文件

转储文件是进程或系统在特定时间点的快照。

驱动程序编写者使用转储文件来调试其驱动程序。该文件必须使用专用工具软件打开。

转储文件包含模块信息、线程信息、堆栈调用信息、异常信息和正在运行的程序的其他数据。

由于服务器运行Java程序时无法追踪代码,因此转储文件是在线事件发生时分析的关键点。

如何生成dump文件

这里我们介绍两种方法:主动和被动。

方式一

主动生成转储文件。首先要做的就是找到正在运行的Java程序的PID。

使用top命令。

009727d3f5744d50b2a83062d179a71f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=iIz3FRJVZX8TAes1xOwVKPuXH9k%3D

接下来,使用jmap 命令生成转储文件。 File后面是保存的文件名,1246是Java程序的PID。

jmap-dump:format=b,file=user.dump1246 b9030e3c607d4173b03cf2a696860312~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=LL5fwzjg0nGJGUUzu5%2B6ZnYoRl4%3D

方式二

在实践中,您常常不知道何时会发生OOM,因此需要在发生OOM时自动生成转储文件。

其实只需要在启动时添加如下参数即可: HeapDumpPath表示生成的dump文件保存的目录。

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=D:\tmp 您还需要模拟OOM 错误来触发转储文件生成。首先,创建界面。

privatestaticMapString,Stringmap=newHashMap();@RequestMapping(‘/oom’)publicStringoom() throwsException{for(inti=0;i100000;i++){map.put(‘key’+i,’value’+i);} return’oom’;} 接下来,将启动堆内存大小设置为32M。

-Xms32M – Xmx32M需要在后台启动并输出日志,所以最终的启动命令将是:

nohupjava-jar-Xms32M-Xmx32M-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/usr/localuser-0.0.1-SNAPSHOT.jarlog.file21 接下来请求oom接口并查看日志。确实发生了OOM错误。

b78e544dee064fd6b4c1335b11344f8e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=RFgA5t9OCyBaqRmDNr%2FBiTBjLGY%3D

如果你检查dump保存的目录,你会发现对应的dump文件确实已经生成了。

396fc471c01040718485c4a3d00b764d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=3aeoM80RHdwvLPglKDx2PNDs%2BxI%3D

如何查看dump文件

这里演示如何使用Jprofiler,它界面可视化,功能也比较齐全。它可以打开JVM工具创建的hporf文件(由-XX:+HeapDumpOnOutOfMemoryError JVM参数触发)。

这里省略安装步骤。请在谷歌或百度上搜索。当我用Jprofiler打开自动生成的java_pid1257.hprof时,看到了以下内容:

5751f4caf5cd492e89558750323025a1~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=LyQm0lRhg1Fobs5JOinTLQMUkwU%3D

可以清楚地看到HashMap的Node和String对象的实例有很多,而且它们占用的内存最多。如果这里还不够清楚,我们来看一下最大的物体。

0aced025e7c844c3bc05c40ac0b319d2~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717745955&x-signature=mIWpvUouzr4eXGFFAYUxkd4MzCQ%3D

这里你可以看到UserController类中的HashMap占用了大量的内存。因此,不难确定OOM的原因是UserController的Map集合。

总结

当然,网上的代码量、类数、实例数都很大,要找到错误原因并不是那么容易的。但是,您至少应该知道要使用哪些工具。了解如何使用以及如何使用它,将有助于您在遇到麻烦时避免恐慌。

我问过一些科技界的大人物,为什么他们不写太多代码,尽管他们的薪水如此之高。我老板说因为网上出现问题,别人解决不了的时候他能解决。这种能力体现了他的个人价值观。

简而言之,大多数程序员可以编写业务代码,但大多数程序员无法进行在线调试。

这就是本文的全部内容。我希望你能通过阅读它从中有所收获。

如果您觉得有帮助,请点个“赞”吧!您的“点赞”是我创作的最大动力。

我是一名试图记住的程序员。下次见!

本人能力有限,如有错误或不妥之处,敬请批评指正,我们共同学习交流!

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/82405.html

(0)
小条's avatar小条
上一篇 2024年5月31日 下午3:37
下一篇 2024年5月31日 下午3:39

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注