OOM,全称是"Out Of Memory",翻译成中文就是"内存用完了",来源于java.lang.OutOfMemoryError
1.OOM产生的原因
内存中加载的数据量过于庞大(一次性从数据库中取出多条数据)
资源使用之后没有及时关闭,导致对象无法被GC回收
代码中存在死循环或循环产生过多重复的对象实体
使用第三方软件中的bug
启动参数内存值设定的过小
2.OOM发生区域
2.1 Java堆溢出:heap (大多数)
java.lang.OutofMemoryError:Java heap space
原因:内存泄露、JVM内存小、创建太多的对象没有释放。
相关JVM参数:-Xms、-Xmx
2.2 Java栈溢出 stack
java.lang.StackOverflowError,常发生于递归。
java.lang.OutofMemoryError: unable to create new native thread,常发生于创建太多线程。
相关JVM参数:-Xss,表示每个线程的堆栈大小。
2.3 方法区溢出
java.lang.OutofMemoryError: PermGen space。
运行时常量保存在方法区,存放的主要是编译器生成的各种字面量和符号引用,但是运行期限也可能将新的常量放入池中
-XX:PermSize:设置持久代(perm gen)初始值,默认值为物理内存的1/64
-XX:MaxPermSize:设置持久代最大值,默认为物理内存的1/4
3.OOM排查流程
需要先设置JVM参数,设定当发生OOM的时候自动生成dump出堆信息:
开启堆快照: -XX: +HeapDumpOnOutOfMemoryError
OOM时日志记录文件位置: -XX:HeapDumpPath=/user/local/error.hprof
通过工具进行排查 例如jvisualvm工具分析dump文件,MemoryAnalyzer等
4.CPU飙高问题排查
服务器CPU飙高排查,先
top看是哪个进程 cpu高
ps -mp 查看进程里面的详细 去除杂项
tid是十进制 java程序是16进制 要通过“%x/n” 来转换
打印方法名