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

浙公网安备 33010602011771号