生产内存溢出定位分析
具体生产环境大多为linux系统,此处以linux系统为示例。
1.什么是oom?
英文全称“Out Of Memory”,译为 “内存不足” ,错误来源于java.lang.OutOfMemoryError。
看下关于的官方说明:
Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector
当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error.
2.为什么会OOM?
3.解决方案
针对大部分情况,通常只需要通过 -Xmx 参数调高 JVM 堆内存空间即可。如果仍然没有解决,可以参考以下情况做进一步处理:
1、如果是超大对象,可以检查其合理性,比如是否一次性查询了数据库全部结果,而没有做结果数限制。
2、如果是业务峰值压力,可以考虑添加机器资源,或者做限流降级。
3、如果是内存泄漏,需要找到持有的对象,修改代码设计,比如关闭没有释放的连接。
4.分析步骤
此处针对代码异常导致的内存溢出进行示例分析:
步骤1
切换到jdk安装目录:
/usr/local/jdk/bin
步骤2
使用jmap获取dump.hprof 命令:
./jmap -dump:live,format=b,file= dump.hprof
步骤3
程序启动用户非root用户,使用
sudo -i user ./jmap -dump:live,format=b,file=dump.hprof
步骤4
执行过程中出现is not secure: file should be owned by the current user
原因:无权限,将jmap命令后file文件路径更换为 /tmp/dump.hprof
步骤5
使用**eclipse memory analyzer(MAT)**分析工具载入dump.hprof
步骤6
步骤7
步骤8
步骤9
获取到具体类占用内存,然后找到代码进行修改
|