如何在linux *** 作系统下检测内存泄漏

如何在linux *** 作系统下检测内存泄漏,第1张

内存泄漏是指程序动态申请的内存在使用完后没有释放,导致这段内存不能被 *** 作系统回收再利用。

例如这段程序,申请了4个字节的空间但没有释放,有4个字节的内存泄漏。

#include <iostream>using namespace stdint main()

{     int *p = new int(1)    cout <<*p<<endl    return 0} 1 2 3 4 5 6 7 8 9

随着时间的推移,泄漏的内存越来越多,可用的内存越来越少,轻则性能受损,重则系统崩溃。

一般情况下,发生内存泄漏时,重启就可以回收泄漏的内存。但是对于Linux,通常跑的是服务器程序,不可以随意重启,在内存泄漏问题上就要格外小心。

内存泄漏特点

难复现 — 要运行到足够长的时间才会暴露。

难定位 — 出错位置是随机的,看不出与内存泄漏的代码有什么联系。

最简单的方法

为了避免写出内存泄漏的程序,通常会有这样的编程规范,要求我们在写程序时申请和释放成对出现的。因为每一次申请都意味着必须有一次释放与它相对应。

基于这个特点,一种简单的方法就是在代码中统计申请和释放的次数,如果申请和释放的数量不同,就认为是内存泄漏了。

#include "stdio.h"#include "stdlib.h"int malloc_count, free_countvoid * my_malloc(int size)

{

    malloc_count++    return malloc(size)

}void my_free(void *p)

{

    free_count++    free(p)

}int main()

{

    count = 0    int *p1 = (int *)my_malloc(sizeif(int))     int *p2 = (int *)my_malloc(sizeif(int))     printf("%d, %d", p1, p2)

    my_free(p1)    if(malloc_count != free_count)         printf("memory leak!\n")    return 0} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 方法分析优点:

直观,容易理解,容易实现

缺点:

1.该方法要求运行结束时对运行中产生的打印分析才能知道结果。

2.该方法要求封装所有申请和释放空间的函数,并在调用的地方修改成调用封装后的函数。虽然C中申请/释放内存接口并不多,但是对于一个大型的项目,调用这些接口的地方却是很多的,要全部替换是一个比较大的工作量。

3.只对C语言适用,不能应用于C++

4.对于所调用的库不适用。如果希望应用于库,则要修改库代码

5.只能检测是否泄漏,却没有具体信息,比如泄漏了多少空间

6.不能说明是哪一行代码引起了泄漏

改进

这种方法虽然简单的,却有许多的不足,无法真正应用于项目中。欲知怎样改进,且看下回分解。

方法/步骤

cat /proc/cpuinfo查看linux系统的CPU型号、类型以及大小,如下图所示。

查看linux系统CPU和内存命令

通过greap命令根据Physical Processor ID筛选出多核CPU的信息。

查看linux系统CPU和内存命令

cat /proc/meminfo查看linux系统内存大小的详细信息,可以查看总内存,剩余内存、可使用内存等信息。

查看linux系统CPU和内存命令

df -h查看linux系统各分区的使用情况,要明确linux系统和windows系统分区的不同。

查看linux系统CPU和内存命令

5

free -m 查看linux系统内存使用量和交换区使用量,如图所示。

查看linux系统CPU和内存命令


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7636029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存