内存溢出排查
【排查步骤】
1.使用:jps -vl,
找到java进程的PID和启动时设置的jvm参数
2.使用:jinfo [PID]
命令查询jvm的配置参数,检查内存配置是否合理;如果解决不了继续第3步
3.使用:jmap -histo:live PID
命令查看哪个类型的对象占用了大量的内存
或使用:jmap -dump:live,format=b,file=jvm_heapLive.hprof PID
命令将堆中的对象信息导出,然后使用jvisualvm工具进行分析
【可能发生oom的场景】
① 堆内存分配得不合理。堆内存配置的太小,或者新生代与老年代的比例配置得不合理,导致创建对象时没有内存空间可以分配。
② 存在大对象。例如大数组、大字符串、Map、集合等。
③ 大量的静态属性,用作本地缓存的Map、List等。
④ 频繁创建对象。例如在循环中不停的创建对象。
⑤ 一次从数据库中读取大量的数据。
⑥ 数据/流量峰值,程序没有做限流,数据量突然激增,导致内存不足。
⑦ 存在内存泄漏。导致内存泄漏的原因主要可以分为两类,一类是资源未释放,例如IO、数据库连接等;另一类是长生命周期的对象引用了短生命周期的对象,导致短生命周期的对象无法被回收,例如经常被提及的ThreadLocal内存泄漏问题。
【jvm启动参数设置】
jvm启动参数设置oom时,dump堆文件:
-XX:+HeapDumpOnOutOfMemoryError 设置当首次遭遇内存溢出时导出此时堆中相关信息
-XX:HeapDumpPath=/tmp/heapdump.hprof 指定导出堆信息时的路径或文件名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义