gperftools 的默认统计规则是, 程序每分配 1 GB, 或每占用 100 MB, 统计一次. 这个行为也可以通过环境变量控制
HEAP_PROFILE_ALLOCATION_INTERVAL: 每分配多少字节的内存统计一次. 默认为 1073741824 (1 GB).HEAP_PROFILE_INUSE_INTERVAL: 每占用多少字节的内存统计一次. 默认为 104857600 (100 MB).HEAP_PROFILE_TIME_INTERVAL: 每隔多少秒统计一次. 默认为 0.HEAPPROFILESIGNAL: 每当收到指定信号统计一次
所以现在使用都是这样使用:在需要打印的地方开启+dump+关闭
HeapProfilerStart("/home/heap_profile");
HeapProfilerDump(dump_label.c_str());
LOG(INFO) << "Heap dump " << dump_label << " completed. ";
HeapProfilerStop();
导出分析报告
pprof --pdf ./server server.0001.heap > heap.pdf
pprof --svg ./face_retrieve_service_ficus "$heap_file" > "$svg_file"
内存分析报告清晰地显示每个函数占用的内存, 这些数据能够帮助我们检查内存泄露. 例如, 通过对比各个时间点函数占用的内存大小, 如果一个函数占用的内存一直在增长, 意味着这个函数很有可能有内存泄露. pprof 提供了 --base 参数帮助我们对比两个时间点的内存变化
pprof --pdf= --base=server.0001.heap ./server server.0003.heap > heap.pdf
内存泄露检查
除了根据内存分析报告手动检查内存泄露, gperftools 还提供了自动的内存泄露检查工具. 检查工具也集成在 tcmalloc 里, 我们同样需要将 libtcmalloc 链接进程序. 检查工具会在程序开始时统计内存的分配和释放, 并且在程序结束前分析内存泄露情况. 设置环境变量 HEAPCHECK=normal 即可开启内存泄露检查
HEAPCHECK=normal ./server
No comments yet.