内存溢出(Out Of Memory

概念

内存溢出指的是:程序在运行过程中需要的内存超过了系统或虚拟机能够提供的上限,导致程序无法继续运行,通常会直接报错或崩溃。

常见原因

  • 一次性加载过多数据(如把超大文件全部读入内存)

  • 创建了大量对象,但内存本身就是不够的

  • 内存参数配置过小(如 JVM 堆内存限制过低)

  • 算法设计不合理,短时间内占用大量内存

特点

  • 问题暴露明显:通常会立即抛出错误

  • 发生迅速:可能在某个操作瞬间就触发

  • 不一定是 Bug:也可能是内存配置不足

示例理解

就像一个只能装 10 升水的桶,你一次性往里倒 15 升水,桶立刻装不下。


内存泄漏(Memory Leak

概念

内存泄漏指的是:程序中某些已经不再使用的内存,仍然被引用,导致无法被释放,内存占用不断增加。

常见原因

  • 对象使用完后仍被持有引用(如静态集合)

  • 监听器、回调函数未正确移除

  • 缓存设计不当,没有清理机制

  • 循环中不断创建对象并保存引用

特点

  • 问题隐蔽:程序一开始运行正常

  • 逐渐恶化:内存占用慢慢升高

  • 最终可能引发内存溢出

示例理解

就像桶里有一些旧水已经没用了,但你一直不倒掉,新水不断加进来,最终桶还是会满。


三、两者的关系与区别

对比项

内存溢出

内存泄漏

本质

内存不够用

内存用完却没释放

发生速度

是否一定是 Bug

不一定

通常是 Bug

结果

程序崩溃

可能导致 OOM

关系总结:

内存泄漏如果长期存在,最终很可能导致内存溢出,但内存溢出不一定是由内存泄漏引起的。