内存溢出排查

【排查步骤】

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 指定导出堆信息时的路径或文件名

 

posted @ 2023-03-19 23:58  Katsu  阅读(264)  评论(0编辑  收藏  举报