18 | 案例篇:内存泄漏了,我该如何定位和处理?
- 没正确回收分配后的内存,导致了泄漏。
- 访问的是已分配内存边界外的地址,导致程序异常退出,等等。
内存的分配和回收
- 只读段,包括程序的代码和常量,由于是只读的,不会再去分配新的内存,所以也不会产生内存泄漏。
- 数据段,包括全局变量和静态变量,这些变量在定义时就已经确定了大小,所以也不会产生内存泄漏。
- 最后一个内存映射段,包括动态链接库和共享内存,其中共享内存由程序动态分配和管理。所以,如果程序在分配后忘了回收,就会导致跟堆内存类似的泄漏问题。
案例
# install sysstat docker
sudo apt-get install -y sysstat docker.io# Install bcc
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/bionic bionic main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install -y bcc-tools libbcc-examples linux-headers-$(uname -r)
$ docker run --name=app -itd feisky/app:mem-leak
$ docker logs app
2th => 1
3th => 2
4th => 3
5th => 5
6th => 8
7th => 13
vmstat
# 每隔 3 秒输出一组数据
$ vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 6601824 97620 1098784 0 0 0 0 62 322 0 0 100 0 0
0 0 0 6601700 97620 1098788 0 0 0 0 57 251 0 0 100 0 0
0 0 0 6601320 97620 1098788 0 0 0 3 52 306 0 0 100 0 0
0 0 0 6601452 97628 1098788 0 0 0 27 63 326 0 0 100 0 0
2 0 0 6601328 97628 1098788 0 0 0 44 52 299 0 0 100 0 0
0 0 0 6601080 97628 1098792 0 0 0 0 56 285 0 0 100 0 0
memleak
# -a 表示显示每个内存分配请求的大小以及地址
# -p 指定案例应用的 PID 号
$ /usr/share/bcc/tools/memleak -a -p $(pidof app)
WARNING: Couldn't find .text section in /app
WARNING: BCC can't handle sym look ups for /appaddr = 7f8f704732b0 size = 8192addr = 7f8f704772d0 size = 8192addr = 7f8f704712a0 size = 8192addr = 7f8f704752c0 size = 819232768 bytes in 4 allocations from stack[unknown] [app][unknown] [app]start_thread+0xdb [libpthread-2.27.so]
$ ls /app
ls: cannot access '/app': No such file or directory
$ docker cp app:/app /app
$ /usr/share/bcc/tools/memleak -p $(pidof app) -a
Attaching to pid 12512, Ctrl+C to quit.
[03:00:41] Top 10 stacks with outstanding allocations:addr = 7f8f70863220 size = 8192addr = 7f8f70861210 size = 8192addr = 7f8f7085b1e0 size = 8192addr = 7f8f7085f200 size = 8192addr = 7f8f7085d1f0 size = 819240960 bytes in 5 allocations from stackfibonacci+0x1f [app]child+0x4f [app]start_thread+0xdb [libpthread-2.27.so]
$ docker exec app cat /app.c
...
long long *fibonacci(long long *n0, long long *n1)
{// 分配 1024 个长整数空间方便观测内存的变化情况long long *v = (long long *) calloc(1024, sizeof(long long));*v = *n0 + *n1;return v;
}void *child(void *arg)
{long long n0 = 0;long long n1 = 1;long long *v = NULL;for (int n = 2; n > 0; n++) {v = fibonacci(&n0, &n1);n0 = n1;n1 = *v;printf("%dth => %lld\n", n, *v);sleep(1);}
}
...
void *child(void *arg)
{...for (int n = 2; n > 0; n++) {v = fibonacci(&n0, &n1);n0 = n1;n1 = *v;printf("%dth => %lld\n", n, *v);free(v); // 释放内存sleep(1);}
}
# 清理原来的案例应用
$ docker rm -f app# 运行修复后的应用
$ docker run --name=app -itd feisky/app:mem-leak-fix# 重新执行 memleak 工具检查内存泄漏情况
$ /usr/share/bcc/tools/memleak -a -p $(pidof app)
Attaching to pid 18808, Ctrl+C to quit.
[10:23:18] Top 10 stacks with outstanding allocations:
[10:23:23] Top 10 stacks with outstanding allocations:
小结
ubuntu 4.15.0-29
# /usr/share/bcc/tools/memleak -a -p 21642
Attaching to pid 21642, Ctrl+C to quit.
perf_event_open(/sys/kernel/debug/tracing/events/uprobes/p__lib_x86_64_linux_gnu_libc_2_27_so_0x97070_21642_bcc_21882/id): Input/output error
Traceback (most recent call last):File "/usr/share/bcc/tools/memleak", line 416, in <module>attach_probes("malloc")File "/usr/share/bcc/tools/memleak", line 406, in attach_probespid=pid)File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 989, in attach_uproberaise Exception("Failed to attach BPF to uprobe")
Exception: Failed to attach BPF to uprobe
18 | 案例篇:内存泄漏了,我该如何定位和处理?相关推荐
- AliOS Things 维测典型案例分析 —— 内存泄漏
维测典型案例分析1 -- 内存泄漏 在系统运行的过程中,内存泄漏是较为常见但是很难复现的现象,一般的内存泄漏点都是比较隐蔽的,每次几十个字节的泄漏,往往需要压测很久才能复现问题.本节案例分析,我们从一 ...
- linux如何定位内存泄漏,快速定位内存泄漏的套路(linux)
快速定位内存泄漏的套路(linux) 快速定位内存泄漏的套路(linux) https://blog.csdn.net/xieyihua1994/article/details/105248362/ ...
- C/C++内存泄漏及检测
2019独角兽企业重金招聘Python工程师标准>>> "该死系统存在内存泄漏问题",项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存 ...
- Java 堆内存泄漏分析的一个例子
Java 程序开发者,多多少少都遇到过 Java 堆内存溢出的错误,错误发生时可以在日志文件中看到 java.lang.OutOfMemoryError: Java heap space 字样.不像 ...
- Android Native 内存泄漏系统化解决方案
导读:C++内存泄漏问题的分析.定位一直是Android平台上困扰开发人员的难题.因为地图渲染.导航等核心功能对性能要求很高,高德地图APP中存在大量的C++代码.解决这个问题对于产品质量尤为重要和关 ...
- 一次解决Linux内核内存泄漏实战全过程
责编 | 张红月 来源 | Linux阅码场 2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题. ...
- 使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践)
使用 .Net Memory Profiler 诊断 .NET 应用内存泄漏(方法与实践) 博客分类: Troubleshooting & tuning .netASP.netLoadrunn ...
- 海思linux内核 太大,一次解决Linux内核内存泄漏实战全过程
责编 | 张红月 来源 | Linux阅码场 2020 年转眼间白驹过隙般飞奔而去,在岁末年初的当口,笔者在回顾这一年程序员世界的大事件后,突然发觉如何避免程序员面向监狱编程是个特别值得一谈的话题. ...
- 常见的【内存泄漏】姿势
关注公众号[高性能架构探索],第一时间获取干货:回复[pdf],免费获取计算机经典书籍 本文节选自文章: 内存泄漏-原因.避免以及定位 本文总结常见内存泄漏的几种方式,留意到这几点,可以避免95+%以 ...
最新文章
- 【实战教程】NLP-Beginner:自然语言处理入门练习
- onenote怎么同步到电脑_详解onenote保存与同步④:本地笔记奇葩的丢失经历
- hdu 4193(单调队列)
- Got a packet bigger than 'max_allowed_packet' bytes
- 【Mybatis】 mapper XML 文件中使用 collection实现一对多关联
- 计算机会计综合作业,20年7月东财《通用财务软件X》综合作业(100分)
- 【蓝桥杯嵌入式】【STM32】9_PWM之实现交替呼吸灯
- javascript 函数初探 (六)--- 闭包初探#4
- 计算机丨浏览器访问出现DNS_PROBE_POSSIBLE解决方法
- 计算机网络安全(一)
- 泱脏武器库之 CVE 2021-4034 Polkit 提权小结
- 4G移动通信基站选址分析
- layui 模板使用
- 服务器系统计划任务不执行,Windows 2008 r2任务计划程序执行批处理失败问题解决方法...
- Angular4与PrimeNG
- 2019.11.4 英语学习
- eventBus VSvueX
- 斗地主洗牌发牌——排序版
- PR菜鸟入门 -- PR基础教学
- iOS支付宝、微信支付
热门文章
- java连接本地oracle数据库_JAVA连接oracle数据库的三种方式
- mysql空间释放_linux 空间释放,mysql数据库空间释放
- java多数据源事务管理_Spring中实现多数据源事务管理 - CSDN博客
- unity 下一帧执行_理解Unity中的优化(三):协程(Coroutines)
- 日照油库系统推荐_数据中心很重要,消防防范更重要——七氟丙烷气体灭火系统...
- curl 请求没反应_理解Redis的反应堆模式
- 厦门one_“断轴”频发,李想承认理想ONE存缺陷!曾声明悬架非常安全
- java简单计算_java简单计算器
- 35所大学获批新增「人工智能」本科专业,工学学位、四年制
- php分布式微服务开发_分布式微服务架构