linux 内存泄漏 定位,一种内存泄露检查和定位的方法

一个系统后台服务进程,可能包括多个线程,在生成环境下要求系统程序能够稳定长时间稳定运行而不宕机。其中一个基本的前提就是需要保证系统程序不存在内存泄露。那么,该如何判读系统程序是否存在内存泄露呢?如果存在,又该如何检测呢?

0.判读系统程序是否存在内存泄露

对于频繁快速申请内存的应用,可以允许下面的命令:

top

-p `pidof YourProgrogram`

如果看到系统内存使用率一直上身,没有下降,就说明很可能存在内存泄露。

对于申请、使用内存比较缓慢的应用程序,可以通过下面的命令,观测一天乃至一周内内存使用率的变化:

for

((i=0;i<100000;i++)); do pidstat -p `pidof YourProgram` -tr | tee

-a thread_mem_static.txt; sleep 10; done

如果上面显示的RSS的内存随着时间推移不断增加,且不符合程序预期,那么很可能存在内存泄露。

f470710b8709850b37ad67900e9807fa.png

1.定位内存泄露的线程或代码位置

检查主进程的每个线程的page

fault的频率,虽然page

fault频率高的不一定有内存泄露,但有内存泄露的线程的page

fault的频率一定很高。而体现每个线程Page

fault频率的指标就是上图中每个线程的minflt/s值,如果它的值一直偏高,就说明该线程反复申请内存或者不停在栈上使用buffer,此时就需要利用gdb打印出每个线程信息,可以参考下面的gdb命令:

gdb

-q --batch --ex "thread apply all bt" -p `pidof tmem`

根据上面对应的线程号找到相应函数,然后进行跟踪,可以参考下面的示例:

9fa9bcaf77dc3e0086992ca92da2d52e.png

上图中显示线程14178

(mem_funcs)线程频繁使用新的内存,查看代码,果然存在内存泄露:

91ad879c202b72b3cf6ff9a3384fd1c7.png

需要强调的是,只有RSS不一直增加,哪怕minflt/s一直增加,也表明没有内存泄露,比如下面的测试程序,频繁使用栈上空间:

void

internal_mem_funcs(void)

{

long

int test[MAX_BUF_LEN] = {0,};

//long

int * test = (long int *)malloc(MAX_BUF_LEN * sizeof(long int));

int

i = 0;

for

(i = 0; i < MAX_BUF_LEN; i++) {

test[i]

= random();

}

return;

}

它的pidstat统计图如下:

ff4bf3989c7f6cbb690c5fccdf604787.png

2.常见的内存泄露方式

笔者最近分析了一个系统服务进程内存泄露的问题,下面总结了一些代码中很容易出现内存泄露的地方:函数正常成功执行的时候有释放内存,但在执行异常退出的时候,没有释放所有先前申请的内存;

对类似strdup()/strndup()/g_strdup()的函数的返回值,使用完之后,没有释放内存的意识;

不同模块或者层次的代码相互调用的时候,没有统一约定好是调用者申请内存、释放内存还是被调用者申请、释放内存,抑或是调用者申请/释放内存,被调用者释放/申请内存,导致后面遗忘释放内存或者重复释放内存;

Java/c++中对异常处理的流程中,遗忘没有释放内存;

使用了一些不太熟悉的第三方库代码,对类似句柄、描述符、对象相关的API了解不够深入,导致没有也不知道该如何释放内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么发送邮件_在Python如何使用SMTP发送邮件

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 Python创建 SMTP…

统计单词个数(划分型)

codevs 1040 统计单词个数 2001年NOIP全国联赛提高组 题目等级 : 黄金 Gold题目描述 Description给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入&#xff0c;且保证每行一定为20个)。要求将此字母串分成k份(1<k<40)&#xff0c…

基于ASP.NET的新闻管理系统(三)代码展示

5.1.1栏目部分 增加栏目&#xff08;addLanMu.aspx&#xff09;&#xff1a; <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"> <title></title> <link rel"stylesheet" type"text/css" …

洛谷-求同构数的个数-NOIP2013提高组复赛

题目描述 Description 所谓同构数是指这样的数&#xff0c;即它出现在它的平方数的右端。例如&#xff0c;5的平方是25 &#xff08;即5525&#xff09;&#xff0c;5是25右端的数&#xff0c;那么5就是同构数。又如&#xff0c;25的平方是625&#xff08;即2525625&#xff09…

plex linux 数据目录,shareplex日常维护文档

2017/07/25##SharePlex日常维护源(SRC)&#xff1a;192.168.1.101 db01目标(TGT):192.168.1.102 db02SRC:su - oraclesp_ctrlshowqstatusshow capture detailshow read detailshow log reverseshow config --查看当前使用参数文件list config --罗列出所有的参数文件(使用和未使…

ifconfig命令找不到_02. Linux命令之查看网络连接

1. 查看网络连接数和端口使用 netstat 命令查看网络连接情况netstat -anp参数&#xff1a;-a 显示所有选项-t (tcp)仅显示tcp相关选项-u (udp)仅显示udp相关选项-n 拒绝显示别名&#xff0c;能显示数字的全部转化成数字。-p 显示建立相关链接的程序名关键列解释:Proto 表示协议…

grep与egrep的区别

grep与egrep的区别&#xff1b; 在linux系统环境下&#xff0c;我们通常使用grep命令来过滤出需要的行而egrep确很少使用&#xff0c;他们的区别其实很简单&#xff0c;grep默认不支持正则表达式&#xff0c;egrep默认支持正则表达式&#xff0c;egrep 等于 grep -E 命令。转载…

python学习之模块(pip),列表生成式,模块操作mysql,excel

python基础 生成式 列表生成式  格式 [表达式 for 表达式 in 迭代对象 (可加判断)] 原&#xff1a; 1 res1 [] 2 for i in range(1,5): 3   res1.append(i) 4 print(res1) 改&#xff1a; 1 res2 [i for i in range(1,5)] 2 print(res2) 字典生成式  格式 {key:value f…

linux驱动read函数 copytouser,Linux驱动编程 step-by-step (五)主要的文件操作方法实现...

主要的文件操作方法实现文件操作函数有很多的操作接口&#xff0c;驱动编程需要实现这些接口&#xff0c;在用户编程时候系统调用时候会调用到这些操作structfile_operations {...loff_t (*llseek) (structfile *, loff_t,int);ssize_t (*read) (structfile *,char__user *,siz…

web开发中的 emmet 效率提升工具

web开发中的 emmet 效率提升工具 可以用来快速生成html 代码。 并且给各种IDE、编辑器提供了插件支持&#xff0c;sublime &#xff0c;webstorm等。 如在webstorm中安装好emmet之后&#xff0c;输入以下文本&#xff0c; #page>div.content[ng-model"user"]ul>…

python二维数组操作_Python二维数组应用与操作

课课家将会在这里为大家详细的介绍一下Python二维数组的相关应用方法以及定义方式&#xff0c;相信朋友们可以从中学习到更多的知识。 Python数组的应用中在实际编程中是一个非常重要的应用技术&#xff0c;作为Python编程人员来说&#xff0c;必须要熟练的掌握这方面的所有应用…

基于光线追踪的渲染中景深(Depth of field)效果的实现

图形学离线渲染中常用的透视摄像机模型时根据小孔成像的原理建立的&#xff0c;其实现通常是从向成像平面上发射ray&#xff0c;并把trace这条ray的结果作为成像平面上对应交点的采样结果。即&#xff1a; 图片来自《Fundamentals of Computer Graphics》 现实中的镜头拍摄的图…

ubuntu 安装 pycharm

添加源&#xff1a;$ sudo add-apt-repository ppa:mystic-mirage/pycharm安装收费的专业版&#xff1a;$ sudo apt update$ sudo apt install pycharm安装免费的社区版&#xff1a;$ sudo apt update$ sudo apt install pycharm-community卸载&#xff1a;$ sudo apt remove p…

带你制作百词斩单词表读写插件

上篇博文简单的介绍了一下Chrome插件&#xff0c;今天就与大家分享一下我做的这款有实际意义的插件吧。 做这款插件主要是用百词斩站点进行单词学习时&#xff0c;遇到的一点点闹心事儿。在单词表中不能听发音。也不能练习拼写。所以才忍无可忍的做了这么一款插件。自我感觉还是…

Linux7改运行级别,Centos7.0修改系统运行级别

首先翻译下ininttab里面的内容&#xff1a;#inittab不再使用时利用系统。#添加配置这会对你的系统没有影响。#Ctrl-Alt-Delete由/usr/lib系统/系统/ctrl-alt-del.target处理#系统使用的目标而不是运行级别。默认情况下&#xff0c;有两个主要目标&#xff1a;#multi-user.targe…

python测试字符串类型的函数_python-02 数据类型 字符串str

字符串str 一、字符串定义 概念&#xff1a;字符串是有序的 不可修改的&#xff0c;元素以引号包围的序列 引号类型&#xff1a;单引号 “”双引号 “ ””三引号 三单引号 print(python) print("python") print(python) print("""python""…

POJ2115 C Looooops(线性同余方程)

无符号k位数溢出就相当于mod 2k&#xff0c;然后设循环x次A等于B&#xff0c;就可以列出方程&#xff1a; $$ CxA \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} $$ 最后就用扩展欧几里得算法求出这个线性同余方程的最小非负整数解。 1 #include<cstdio>2 #incl…

工作测试博客

工作测试博客转载于:https://blog.51cto.com/12559670/1895000

iphone各机型参数对比_带你了解新款iPhone 12系列四款机型

2020年10月14日凌晨1&#xff1a;00&#xff0c;苹果召开新品发布会&#xff0c;发布了新款iPhone 12系列手机&#xff0c;“果粉”们期待已久的iPhone 12终于来了。iPhone 12系列手机共有四款机型&#xff0c;分别是iPhone 12 mini、iPhone 12、iPhone 12 Pro、iPhone 12 Pro …

设置开机自启动服务

一、软链接方法 利用ln -s 命令将/etc/rc.d/init.d/目录下脚本&#xff08;注意执行权限&#xff09;软连接到 rc3目录下&#xff0c;/etc/rc.d/rc3.d 目录也就是我们一般的系统运行级别。ln -s /etc/rc.d/init.d/** /etc/rc.d/rc3.d/S**这里的S代表的是开机自启动服务&#x…