前言
OOM,在业内当之无愧被称为是Java程序员的噩梦之一。无论是初出茅庐的新手还是经验丰富的专家,都难以避免在开发过程中遭遇这一难题。尤其在业务高峰时段,应用程序因频繁的OOM错误导致服务中断和重启,实在令人头疼。如何快速定位及解决此问题,本文我们将与您详细探讨。
什么是OOM?
OOM,全称OutOfMemoryError,顾名思义,就是内存不够用了。Java程序运行过程中,JVM(Java虚拟机)为程序分配内存,但有时程序占用的内存超过了JVM分配的最大内存,就会出现OOM错误。
OOM的常见场景包括:
-
堆内存溢出:通常发生在应用程序创建了大量对象,并且这些对象长时间存活 。
-
方法区内存溢出:与类的加载和元数据的存储有关,可能由于类加载过多或类加载器泄露造成。
-
直接内存溢出:通常与线程的执行和递归调用有关,例如递归调用过深或线程创建过多。
堆内存溢出最常见,比如你写了个循环,不小心生成了无数对象,内存爆了,JVM就“罢工”了。到这里有些童鞋可能会问,不是有full GC吗,为什么还会发生OOM?这里简单解释一下,full gc收集的是“垃圾”,即不可达的对象,如果对内存中的对象大部分是可达的,此时又有新的对象