这篇文章包含在Github精选中。欢迎您star:https://github.com/yehongzhi/learningsummary
前言
在日常开发中,无论您多么仔细地编写代码,都不可避免地会发生各种意外事件,例如服务器内存突然增加或内存不足溢出(OOM)。遇到这种情况,该如何排查并分析原因呢?
现在我们来谈谈本文描述的转储文件。
什么是dump文件
转储文件是进程或系统在特定时间点的快照。
驱动程序编写者使用转储文件来调试其驱动程序。该文件必须使用专用工具软件打开。
转储文件包含模块信息、线程信息、堆栈调用信息、异常信息和正在运行的程序的其他数据。
由于服务器运行Java程序时无法追踪代码,因此转储文件是在线事件发生时分析的关键点。
如何生成dump文件
这里我们介绍两种方法:主动和被动。
方式一
主动生成转储文件。首先要做的就是找到正在运行的Java程序的PID。
使用top命令。
接下来,使用jmap 命令生成转储文件。 File后面是保存的文件名,1246是Java程序的PID。
jmap-dump:format=b,file=user.dump1246
方式二
在实践中,您常常不知道何时会发生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错误。
如果你检查dump保存的目录,你会发现对应的dump文件确实已经生成了。
如何查看dump文件
这里演示如何使用Jprofiler,它界面可视化,功能也比较齐全。它可以打开JVM工具创建的hporf文件(由-XX:+HeapDumpOnOutOfMemoryError JVM参数触发)。
这里省略安装步骤。请在谷歌或百度上搜索。当我用Jprofiler打开自动生成的java_pid1257.hprof时,看到了以下内容:
可以清楚地看到HashMap的Node和String对象的实例有很多,而且它们占用的内存最多。如果这里还不够清楚,我们来看一下最大的物体。
这里你可以看到UserController类中的HashMap占用了大量的内存。因此,不难确定OOM的原因是UserController的Map集合。
总结
当然,网上的代码量、类数、实例数都很大,要找到错误原因并不是那么容易的。但是,您至少应该知道要使用哪些工具。了解如何使用以及如何使用它,将有助于您在遇到麻烦时避免恐慌。
我问过一些科技界的大人物,为什么他们不写太多代码,尽管他们的薪水如此之高。我老板说因为网上出现问题,别人解决不了的时候他能解决。这种能力体现了他的个人价值观。
简而言之,大多数程序员可以编写业务代码,但大多数程序员无法进行在线调试。
这就是本文的全部内容。我希望你能通过阅读它从中有所收获。
如果您觉得有帮助,请点个“赞”吧!您的“点赞”是我创作的最大动力。
我是一名试图记住的程序员。下次见!
本人能力有限,如有错误或不妥之处,敬请批评指正,我们共同学习交流!
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/82405.html