什么是内存溢出?它是如何产生的?代码举例讲解

内存溢出(Memory Overflow)是程序运行时所申请的内存超出系统容许的最大值。它会导致程序运行异常,甚至崩溃。

内存溢出的主要原因有:

  1. 程序申请过多内存,超出系统可用内存上限。
  2. 程序存在内存泄漏,长时间不能释放不再使用的内存,导致可用内存减少。
  3. 程序存在无限循环或递归,持续申请更多内存。

来看几个简单示例:

申请过多内存:

byte[] bytes = new byte[Integer.MAX_VALUE]; 

运行结果:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

内存泄漏:

public class MemoryLeak {
    public static void main(String[] args) {
        Map<Integer, Integer> map = new HashMap<>();
        while(true) {          
            for(int i = 0; i < 100000; i++) {
                map.put(i, i);
            }
        }
    }
}


运行一段时间后会抛出OOM异常。

无限递归:

public void recursiveCall() {
    recursiveCall(); 
}

public void main() {
    recursiveCall();
}

运行结果:

Exception in thread "main" java.lang.StackOverflowError