【JVM】OOM 原理和排查

目录

1.OOM产生的原因

2.OOM发生区域

2.1 Java堆溢出:heap (大多数)

2.2 Java栈溢出 stack

2.3 方法区溢出

3.OOM排查流程

4.CPU飙高问题排查


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高

【JVM】OOM 原理和排查_第1张图片

【JVM】OOM 原理和排查_第2张图片

  ps -mp  查看进程里面的详细  去除杂项【JVM】OOM 原理和排查_第3张图片

tid是十进制  java程序是16进制  要通过“%x/n” 来转换 

【JVM】OOM 原理和排查_第4张图片

打印方法名

【JVM】OOM 原理和排查_第5张图片

你可能感兴趣的:(Java基础,jvm,java)