C++开发如何排查内存泄露(增长)
不一定是内存泄露,也可能是内存持续分配,一直上涨,直到最后OOM。
工具的使用¶
top¶
观察RES变化。
pmap¶
pmap -x [pid] > tmp_time1.txt
# -k3,3n 排序依据第三列,即内存大小, 第三列是RES列
awk '{print $0}' tmp_time1.txt | sort -k3,3n | tail -n 10
# 提取 server_0418_2011.txt 中的地址列
awk '{print $1}' server_0418_2011.txt > addresses_0418.txt
# 使用 awk 处理 server_0419_2011.txt,打印不在 addresses_0418.txt 中的地址和对应的第三列
awk 'NR==FNR {addr[$1]; next} !($1 in addr) {print $1, $3}' addresses_0418.txt server_0419_2011.txt
awk '{print $1, $3}' server_0418_2011.txt > data1.txt
awk '{print $1, $3}' server_0419_2011.txt > data2.txt
join -o 1.1 1.2 2.2 data1.txt data2.txt | \
awk '{print $1, $3-$2, $2, $3}' | \
sort -k2,2nr | head -n 100
理念¶
缩小范围,减少模块,最小单元复现。
- new、malloc没有释放
- vector或者map一直增长
ptmalloc换成jemalloc或者tcmalloc¶
内存不回收,碎片一直增加,导致oom。
定位工具。
malloc_trim(); 手动释放内存。
// https://zhuanlan.zhihu.com/p/682033366
valgrind --tool=massif