首先报OOM的原因无外乎有两大类:一类是堆空间不足,另一类是元空间不足(直接内存)
堆空间不足
一、内存泄漏问题导致
1、内存泄漏:严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏
,由于这些对象不能被垃圾收集掉,这样的对象多了,有可能就会OOM
。
举一个生活中的不太恰当的例子:假设你有一个妹妹她小时候买了一个很可爱的玩偶,现在她长大了,但是这个玩偶还是一直都没有扔掉它,家里人也不会去丢掉它 ,那么这样的玩偶多了,一直在家就可能把你家堆满(OOM)。这个例子里的这个玩偶就相当于一个没有引用的对象,这个对象(玩偶)程序都不用了,但是由于它和其中某一个有引用的对象有联系,所以垃圾回收时也不会去回收它。
内存泄漏出现的原因总结
(1)单例对象
,这样存活时间很长的对象引用了使用时间很短的对象,那么这个被引用的对象就一直不能被回收,单例的生命周期和应用程序是一样长的,所以单例程序中,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏的产生;
(2)各种连接资源对象
,数据库连接(dataSourse . getConnection()),网络连接(socket)和io连接必须手动close,否则是不能被回收的,这些资源连接都要在finally{}中手动关闭;
(3)静态集合类
,例子:
static final ArrayList ARRAY_LIST = new ArrayList();
public void addObject() {
Object obj = new Object();// 原本obj对象对应的栈帧一出栈obj对象就会消除,未逃逸
ARRAY_LIST.add(obj); // 但是由于有静态集合的引用