内存溢出(Memory Overflow)是程序运行时所申请的内存超出系统容许的最大值。它会导致程序运行异常,甚至崩溃。
内存溢出的主要原因有:
- 程序申请过多内存,超出系统可用内存上限。
- 程序存在内存泄漏,长时间不能释放不再使用的内存,导致可用内存减少。
- 程序存在无限循环或递归,持续申请更多内存。
来看几个简单示例:
申请过多内存:
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