Plantre Plantre
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

plantre

一个后端开发者
首页
后端
技术
硬件
  • 前端文章

    • HTML
    • CSS
    • JavaScript
  • 技术

    • 技术文档
    • GitHub技巧
    • Nodejs
    • 博客搭建
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 计算机组成原理

  • 操作系统

  • 计算机网络

  • 设计模式

  • Java

    • Java基础

    • Java集合

    • Java并发

    • JVM

      • JVM内存模型
      • JVM垃圾回收中的道法术器
      • Minor GC,Major GC,Young GC,Old GC,Major GC有什么区别
      • Minor GC时老年代在干什么
      • ​​Major GC时年轻代在干什么
      • Full GC​时年轻代和老年代在干什么
      • 常用垃圾回收器对比
      • OOM、内存泄漏与内存溢出的区别解析
      • 类的加载机制
  • Spring

  • SpringCloud

  • MySQL

  • Redis

  • 分布式

  • Zookeeper

  • Dubbo

  • Kafka

  • 数据结构

  • 算法

  • OJ

  • 从道家哲学看计算机?
  • 后端
  • Java
  • JVM
plantre
2025-05-04

OOM、内存泄漏与内存溢出的区别解析

OOM、内存泄漏与内存溢出的区别解析

1. 核心定义

概念 定义 关键特征
OOM(内存不足) 程序运行过程中因内存不足而触发的错误,表现为 OutOfMemoryError 或系统强制终止进程。 是内存问题的最终结果,可能由内存泄漏或内存溢出导致。
内存泄漏 程序申请内存后未正确释放,导致内存无法被重复利用。 内存占用随时间持续增长,长期积累会引发OOM。
内存溢出 程序一次性申请的内存超过可用内存限制,或系统无法满足动态分配需求。 内存需求瞬间超过容量,常见于大对象加载或递归调用过深。

2. 核心区别

  1. 触发机制
    • 内存泄漏:因代码逻辑缺陷导致内存无法回收(如未关闭资源、静态集合持有对象)。

    • 内存溢出:因内存分配不合理或系统资源不足(如堆设置过小、递归调用过深)。

    • OOM:是前两者的最终表现形式,属于错误结果而非原因。

  2. 时间特性
    • 内存泄漏:渐进式消耗内存(如缓存未清理导致内存逐渐耗尽)。

    • 内存溢出:突发性内存需求(如加载超大文件到内存)。

    • OOM:可能由任一情况触发,但泄漏更易导致长期OOM。

  3. 影响范围
    • 内存泄漏:常影响堆内存,但资源泄漏(如文件句柄未释放)也会导致系统级问题。

    • 内存溢出:可能涉及堆、栈或元空间(如递归调用过深引发栈溢出)。

    • OOM:覆盖所有内存区域(堆、栈、直接内存等)。


3. 典型场景与案例

  1. 内存泄漏
    • 示例:未关闭数据库连接导致连接池耗尽;静态Map缓存未清理。

    • 特点:程序运行越久,内存占用越高,最终触发OOM。

  2. 内存溢出
    • 示例:一次性加载10GB文件到堆内存;递归调用未设终止条件导致栈溢出。

    • 特点:突发性内存需求超过系统上限,直接触发OOM。

  3. OOM类型
    • 堆溢出:java.lang.OutOfMemoryError: Java heap space(对象过多或泄漏)。

    • 元空间溢出:OutOfMemoryError: Metaspace(类加载过多)。

    • 栈溢出:StackOverflowError(递归深度过大)。


4. 关系与递进 • 内存泄漏 → 内存溢出 → OOM:

内存泄漏长期积累导致可用内存减少,最终无法满足正常需求,触发溢出和OOM。
• 独立触发路径:

内存溢出可能由一次性错误(如超大数组申请)直接导致,无需泄漏积累。


5. 排查与解决策略

问题类型 排查工具 解决方向
内存泄漏 Eclipse MAT、VisualVM分析堆快照 修复未关闭的资源、清理静态集合、优化缓存策略。
内存溢出 JVM参数监控(jstat、jmap) 调整堆大小(-Xmx)、优化递归逻辑、分页处理数据。
OOM GC日志分析、系统内存监控 结合泄漏和溢出方案,必要时升级硬件或改用低内存占用的数据结构。

总结 • OOM是内存问题的最终表现,内存泄漏是长期隐患,内存溢出是短期过载。

• 核心差异:泄漏是“忘记还篮子”,溢出是“篮子装不下”,OOM是“彻底没篮子可用”。

• 调优优先级:优先解决内存泄漏(因其隐蔽性更强),再优化内存分配策略。

编辑 (opens new window)
上次更新: 2025/06/10, 09:18:05
常用垃圾回收器对比
类的加载机制

← 常用垃圾回收器对比 类的加载机制→

最近更新
01
集成loki
07-04
02
TCP的ESTABLISHED是什么意思
06-24
03
安装1panel
06-24
更多文章>
Theme by Vdoing | Copyright © 2025-2025 plantre | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式