一、背景介绍
前段时间朋友新进入一个公司,遇到线上系统cpu飙高,内存占满情况;和他交流过后有了本篇总结,该博文会以一个简单的小例子来演示oom,以及通过输出dump文件,最后用可视化工具进行分析定位具体oom的代码。
二、思路&方案
- 1.编写小例子,执行死循环一直给map中赋值
- 2.启动设置初始内存和最大内存值(这里要设置的小一点)
- 3.启动命令中通过设置参数将dump文件输出到指定目录中(windows和linux的目录有区别需要注意)
- 4.执行调用,通过可视化工具查看dump文件
- 5.分析dump文件,找到oom的具体代码行,进行调整和修改;最终修复上线
三、过程
- 1.小例子的源码以及jar包连接为:https://download.csdn.net/download/u013030601/85073353
- 2.启动命令:
java -jar -Xms32M -Xmx32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:// testdumpfile-1.0-SNAPSHOT.jar
- 3.执行调用:
- 4.通过jdk自带的工具查看dump文件;
4.1.找到本机中jdk的bin目录下的jvisualvm.exe,双击打开
4.2.通过如下截图选择dump文件
4.3.展示分析结果,找到具体出现oom的代码行
- 5.如果程序正在启动可通过如下方式输出dump文件
5.1.获取应用的pid
使用ps -ef | grep java查询服务器上的java应用进程信息,找到应用进程及id
5.2.使用jmap获取dump信息
jmap -dump:live,format=b,file=/home/app/dump.hprof 19756
注:/home/app/表示生成的dump文件的存放地址及文件名,自己定义存放位置,19756表示1中查询到的应用pid
四、总结
1.通过该例子执行,训练了自己对于出现问题以及如何排查问题的闭环执行
2.实践出真理,又一次验证了万事万物必有根源,顺藤摸瓜终究能处理掉问题
3.该方式建议在测试环境中通过一定的测试手段将该问题提前发现提前解决
4.在开发中不能将资源想象成无限的;要在有限的资源中做到最大的效率
五、升华
任何事情的出现一定有相关参与人需要极力去提升的地方,那么:找到问题——>解决问题——>思考根源——>规避问题——>落实规避效果 就显得尤为重要了。
希望读者朋友也能够在自己人生路上不断规避这样的问题,让自己走的更快飞得更高。
参考文章:
https://blog.csdn.net/weixin_43861049/article/details/95043077
https://blog.csdn.net/weixin_42661074/article/details/86525119