003.内存问题有哪些?

下面把常见的内存问题按「问题类型 → 表现 → 根因 → 危害 → 检测/定位手段」系统性整理成一个工程级表格


一、内存问题全景表(工程实践版)

内存问题类型 典型表现 根本原因 直接危害 常见检测 / 定位手段
内存泄漏(Memory Leak) 进程 RSS 持续增长,长期运行后 OOM malloc/new 后未 free/delete;引用未释放 OOM、服务重启、系统不稳定 Valgrind、ASan、eBPF uprobe/uretprobe
野指针(Dangling Pointer) 随机崩溃、非法访问 free 后继续使用指针 崩溃、数据破坏 ASan、GDB、core dump
空指针解引用 程序立即崩溃 未判空直接访问 崩溃 静态分析、ASan
重复释放(Double Free) glibc 报错或崩溃 同一指针多次 free 内存结构破坏 ASan、Valgrind
越界访问(Out-of-Bounds) 随机错误、数据异常 数组/缓冲区边界错误 数据破坏、漏洞 ASan、Valgrind
Use-After-Free 偶发崩溃、不可复现 free 后再次访问 安全漏洞、崩溃 ASan、eBPF malloc/free 关联
内存碎片(Fragmentation) 内存足够但 malloc 失败 大小不均的频繁分配释放 性能下降、分配失败 malloc stats、heap profiling
未初始化内存 逻辑异常、脏数据 malloc 后未初始化 隐蔽 bug Valgrind、MSan
栈溢出(Stack Overflow) 程序崩溃 递归过深、栈变量过大 崩溃 GDB、ulimit、core dump
堆溢出(Heap Overflow) 崩溃或被利用 写越界 安全漏洞 ASan
内存抖动(Memory Churn) CPU 高、GC/alloc 频繁 高频 malloc/free 性能严重下降 perf、eBPF alloc trace
内存热点(Hot Allocation) 某路径分配占比极高 设计不合理 性能瓶颈 eBPF 统计分配栈
地址空间泄漏(VMA Leak) VMA 数暴涨 mmap 未 munmap mmap 失败 /proc/pid/maps
文件页泄漏(Page Cache) RSS 不高但内存吃紧 IO 行为异常 系统内存压力 free、/proc/meminfo
Cgroup 内存超限 容器被 OOM kill 内存限制过低 服务中断 cgroup events
NUMA 远端内存访问 性能异常慢 线程/内存跨 NUMA 延迟增加 numactl、perf
TLB Miss 过多 CPU stall 大量随机访问 性能下降 perf
内存锁死(mlock) 可用内存减少 mlock 未释放 系统压力 /proc/pid/status
GC 停顿(语言层) 卡顿、RT 抖动 分配模式不合理 延迟不稳定 GC log、alloc profiler

二、按「工程视角」再归一层(你做课程/工具会非常有用)

1️⃣ 功能性错误(Bug 型)

  • 内存泄漏
  • Use-after-free
  • 越界访问
  • 空指针
  • 重复释放

👉 目标:不崩、不泄、不踩内存
👉 工具:ASan / Valgrind / eBPF


2️⃣ 性能型问题

  • 内存抖动
  • 热点分配
  • 内存碎片
  • NUMA 远端访问
  • TLB miss

👉 目标:快、稳、可扩展
👉 工具:perf + eBPF alloc 栈统计


3️⃣ 系统级问题

  • Page Cache 吞内存
  • mmap 泄漏
  • cgroup OOM
  • mlock 锁内存

👉 目标:系统层可控
👉 工具:/proc + eBPF + cgroup


4️⃣ 语言 / 运行时问题

  • GC 频繁
  • 堆扩容抖动
  • 对象生命周期不合理

👉 目标:运行时可解释
👉 工具:语言 profiler + 系统级 eBPF

posted @ 2026-06-02 00:12  BlackSnow  阅读(36)  评论(0)    收藏  举报