from: https://blog.intzero.net/tools/jemalloc.html

Jemalloc 不仅实现了一种通用的malloc, 还能利用它来做内存分析和监控/调优等.

这里介绍如何利用jemalloc来检测内存泄漏问题. 并且利用LD_PRELOAD环境变量, 可以做到不需要源代码, 将jemalloc库嵌入到可执行程序中, 从而用jemalloc去malloc内存, 并进行管理. 也就是说, 每当程序中调用malloc/new时, 实际调用的是jemalloc里实现的函数.

Install

从releases获取jemalloc最新版.

参考: https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md

cd ~/jemalloc_test
wget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2
tar zxvf jemalloc-5.1.0.tar.bz2
cd jemalloc-5.1.0
./configure --prefix=/home/intzero/jemalloc_test/jemalloc_install # 我这里装在自己目录下 make make install export PATH=/home/intzero/jemalloc_test/jemalloc_install/bin:$PATH 

Getting Started

参考: https://github.com/jemalloc/jemalloc/wiki/Getting-Started

有几种方式将jemalloc整合到你的程序中.

  • 一种是在源代码中加入jemalloc代码, 在build代码时嵌入.
  • 另外一种是利用LD_PRELOAD环境变量, 在程序运行时就能嵌入, 不需要源代码.

另外可以通过 MALLOC_CONF环境变量来调整jemalloc.

写个demo测试一下.

vi main.cpp

#include <stdlib.h>
#include <iostream> #include <jemalloc/jemalloc.h> using namespace std; void do_something(size_t i) { // Leak some memory. int *p = new int[i]; // or malloc(i * 4); } int main(int argc, char **argv) { for (size_t i = 1; i <= 1000; i++) { do_something(i); } cout << "jemalloc test." << endl; // Dump allocator statistics to stderr. malloc_stats_print(NULL, NULL, NULL); return 0; } 

运行:

$ g++ main.cpp -o main -I`jemalloc-config --includedir` -L`jemalloc-config --libdir` -Wl,-rpath,`jemalloc-config --libdir` -ljemalloc `jemalloc-config --libs` $ ./main 

可看到打印出来的内存信息.

Leak Checking

vi main.cpp

#include <stdlib.h>
#include <iostream> using namespace std; void do_something(size_t i) { // Leak some memory. int *p = new int[i]; // or malloc(i * 4); } int main(int argc, char **argv) { for (size_t i = 1; i <= 1000; i++) { do_something(i); } cout << "jemalloc test." << endl; return 0; } 

运行:

$ g++ main.cpp -o main
$ MALLOC_CONF=prof_leak:true,lg_prof_sample:0,prof_final:true LD_PRELOAD=/home/intzero/jemalloc_test/jemalloc_install/lib/libjemalloc.so.2 ./main 

上面这条命令会执行./main, 并将jemalloc提前加载进去.

程序退出之后, 会生成类似jeprof.37252.0.f.heap的文件. 查看详细信息:

$ jeprof --show_bytes `which ./main` jeprof.37252.0.f.heap Using local file jeprof.37252.0.f.heap. Welcome to jeprof! For help, type 'help'. (jeprof) top Total: 2173680 B 2173680 100.0% 100.0% 2173680 100.0% 0x00007f8f2f7d7ac0 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2e5b1b13 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2f788581 0 0.0% 100.0% 2173680 100.0% 0x00007f8f2f7e93a0 0 0.0% 100.0% 2173680 100.0% _start 0 0.0% 100.0% 2173680 100.0% do_something 0 0.0% 100.0% 2173680 100.0% main (jeprof) 

还可以生成call graph的PDF文件:

jeprof --show_bytes --pdf `which ./main` jeprof.37252.0.f.heap > w.pdf 

转载于:https://www.cnblogs.com/Arborday/p/10973502.html

[转] 利用jemalloc分析内存泄漏相关推荐

  1. 利用jemalloc分析内存泄漏以及LD_PRELOAD

    <Linux环境下的LD_PRELOAD:库预加载> GitHub代码:https://github.com/Rtoax/test/tree/master/jemalloc 目录 Inst ...

  2. 利用S_MEMORY_INSPECTOR分析内存泄漏问题

    我在批量生成service order时,report运行几个小时后,遇到out of memory exception: SM04里发现我的report随着时间的推移,消耗的内存越来越多: 如何找到 ...

  3. 利用MAT进行内存泄漏分析

    ##前言 对于程序员来说码代码容易,保证代码的稳定性很难.有时候写完一个功能可能只需要一天时间,但是这个功能隐藏的bug导致的线上问题排查可能需要一周或者更长时间.因此,拥有良好的代码结构和编码规范是 ...

  4. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)

    使用Memory Analyzer tool(MAT)分析内存泄漏(一) (2010年05月21日) 发表于 Java博客 前言的前言 :本文是自 2005 年 8 月以来,首次在一个月之内发布三篇文 ...

  5. 使用Memory Analyzer tool(MAT)分析内存泄漏

    http://www.blogjava.net/rosen/archive/2010/05/21/321575.html http://www.blogjava.net/rosen/archive/2 ...

  6. 使用Memory Analyzer tool(MAT)分析内存泄漏(二)

    前言 在 使用Memory Analyzer tool(MAT)分析内存泄漏(一)中,我介绍了内存泄漏的前因后果.在本文中,将介绍MAT如何根据heap dump分析泄漏根源.由于测试范例可能过于简单 ...

  7. Profiler分析内存抖动,Memory Analyzer(mat)分析内存泄漏(不懂砍我)

    前言: 最近在系统性的温习了一遍android性能优化.写博客是学习也是记录,希望在记录的同时也能帮助其他同学.最近我觉得我想出一个不懂系列."不懂揍我","不懂砍我&q ...

  8. Memory Analyzer分析内存泄漏

    Memory Analyzer分析内存泄漏 模拟一次内存溢出 程序不断地向ArrayList添加对象,直至溢出 public class User {String userName;String pa ...

  9. 手把手教你在Android-Studio上分析内存泄漏,面试必会

    导语 本文的目的很简单,一句话:用最少的时间,最高效率,让你清楚:想要做Android开发,你需要学什么?你该在哪学? 本文的特点在于将繁琐的知识化为系列专题的形式展现给读者,当你能跟随博主构建的体系 ...

最新文章

  1. RabbitMQ超详细安装教程(Linux)
  2. Hadoop 单节点 伪分布 安装手记
  3. 第22届清华大学电子设计大赛决赛
  4. webpack 配置简单说几句 ?
  5. python画图-用Python画图
  6. shardingjdbc全局表_Sharding-JDBC动态分表实现
  7. 有关采用SMIv2 Internet协议的SNMPv2 MIB
  8. C语言中变量的储存类别
  9. java编程思想 Chapter 2
  10. 《智能家居产品 从设计到运营》——2.2 智能设备的触角:传感器
  11. 百度编辑器 UEditor 使用方法 及 如何设置固定高度且带滚动条及 如何设置修改传值的 name 属性
  12. ARP防火墙 (防如网络执法官、网络剪刀手、局域网终结者限制本机网速)
  13. mac安装ios和Android模拟器进行h5页面调试
  14. 【通过】华为OD机试真题59:叠积木
  15. 《炬丰科技-半导体工艺》通过蚀刻技术为LED衬底开发低成本、高通量的硅
  16. Map集合、 HashMap集合、LinkedHashMap集合、Hashtable集合
  17. C语言详解系列——函数的认识(4)函数的声明与定义,简单练习题
  18. 《2022爱分析·营销服一体化实践报告》发布:营销服一体化重塑企业增长新链路
  19. Smart210学习记录------块设备
  20. 有了钉钉和企业微信,企业还需要专属IM吗?

热门文章

  1. 25.2. String
  2. CoreAnimation动画
  3. mysqldiff对比主从表结构是否一致
  4. 架构演进之「微服务架构」
  5. TLS1.3 协议的Golang 实现——ClientHello
  6. 【Micropython】发光二极管手工制作炫彩跑马灯
  7. Hibernate 缓存机制
  8. CSS中绝对定位依据谁进行定位?
  9. 0909 编译原理1
  10. 8、显示程序占用内存多少.txt