1.内存溢出的原因
OOM的排查思路_oom排查_java排坑日记的博客-CSDN博客
每个进程的内存(限制,譬如2G)=最大堆容量+最大方法区容量+程序计数器+虚拟机栈和本地方法栈。多线程下每个线程栈越大,越容易OOM.
1.堆内存溢出(OOM)
1)大对象(从数据库里一次请求了大量的数据)
2)同时引用的对象过多(大批量的请求、批量任务导致)
3)内存泄漏(使用了file之类的资源没有关闭回收)
解决方案:
1.-xmx 调高jvm堆内存空间
2.优化代码,查询过滤
3.添加机器资源,流量降级
4.内存泄漏:定位内存泄漏原因,优化代码
2. 栈内存溢出(StackOverFlow)
-Xss
1.方法调用栈过长
2.线程数过多
3.MetaSpace OOM
1.加载的类过多
解决方案:
-XX:MaxMetaSpaceSize 扩大元数据区大小
4.直接内存溢出
dump文件不会有明显异常
1.主要为native方法导致 、NIO
解决方案:
配置参数调整内存大小
排查手段:
- 重启
2.heap dump获取内存快照,通过分析工具,进行定位
事先开启HeadDumpOnOutOfMemoryError,这样出现OOM的时候能自动留下Dump,留好第一现场。这是最推荐的方式。
JVM的启动参数中加入如下的一些参数:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/usr/local/oom
第一个参数意思是在OOM的时候自动dump内存快照出来,第二个参数是说把内存快照存放在哪里
2.CPU占用过高
问题:
- 多线程并发,数据密集型。
问题定位(死锁同理):
top查看进程,jps查看进程对应的Java程序,(top -Hp 进程)查看进程下线程的情况,jstack+线程ID查看执行栈信息