• Linux内存使用情况以及内存泄露分析之工具与方法


    Linux C/C++ Memory Leak Detection Tool

    1. 内存使用情况分析

    1.1 系统总内存分析

    通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached

    MemTotal:        5933132 kB
    MemFree:         4485932 kB
    MemAvailable:    4822944 kB
    Buffers:          122148 kB
    Cached:           630048 kB
    SwapCached:            0 kB
    Active:           806136 kB
    Inactive:         461288 kB
    Active(anon):     516344 kB
    Inactive(anon):   230112 kB
    Active(file):     289792 kB
    Inactive(file):   231176 kB
    Unevictable:          32 kB
    Mlocked:              32 kB
    SwapTotal:       7999484 kB
    SwapFree:        7999484 kB
    Dirty:               204 kB
    Writeback:             0 kB
    AnonPages:        515264 kB

    echo 3 > /proc/sys/vm/drop_caches,会清理系统的cache。

    Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.

    1-to free pagecache, 2-to free dentries and inodes, 3-to free pagecache, dentries and inodes。

    1.2 进程内存分析

    cat /proc/{pid}/maps

    2 内存泄露

    2.1 内存泄露类型

    1. 常发性内存泄漏
    发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏

    2. 偶发性内存泄漏
    发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要

    3. 一次性内存泄漏
    发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块且仅有一块内存发生泄漏

    4. 隐式内存泄漏
    程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏

    2.2 常用内存泄露检测工具

    C/C++
    1. Valgrind: Debugging and profiling Linux programs, aiming at programs written in C and C++ 
    2. ccmalloc: Linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库 
    3. LeakTracer: Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏 
    4. Electric Fence: Linux分发版中由Bruce Perens编写的malloc()调试库 
    5. Leaky: Linux下检测内存泄漏的程序 
    6. Dmalloc: Debug Malloc Library 
    7. MEMWATCH: 由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行 
    8. KCachegrind: A visualization tool for the profiling data generated by Cachegrind and Calltree 

    2.3 内存检测原理

     3. 常用工具

    3.1 Linux内核内存泄漏检测kmemleak

    kmemlean提供了一种检测内核内存泄露的方法,当内存对象没有被释放是,将其记录在/sys/kernel/debug/kmemleak中。

    3.1.1 使能kmemleak

    CONFIG_DEBUG_KMEMLEAK=y
    CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400
    # CONFIG_DEBUG_KMEMLEAK_TEST is not set
    CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=n----------默认打开

    如果没有打开KMEMLEAK_FULL,则使用了精简版。完整版比较耗内存,精简版适合嵌入式调试。

    3.1.2 配置获取kmemleak结果

    参数配置:

    off 禁用kmemleak(不可逆)
    stack=on 启用任务堆栈扫描(default)
    stack=off 禁用任务堆栈扫描
    scan=on 启动自动记忆扫描线程(default)
    scan=off 停止自动记忆扫描线程
    scan=<secs> 设置n秒内自动记忆扫描
    scan 开启内核扫描
    clear 清除内存泄露报告
    dump=<addr> 转存信息对象在<addr>
    通过“kmemleak = OFF”,也可以在启动时禁用Kmemleak在内核命令行。在初始化kmemleak之前,内存的分配或释放这些动作被存储在一个前期日志缓冲区。这个缓冲区的大小通过配CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE设置。 
    cat /sys/kernel/debug/kmemleak > kmemleak.txt

     

    3.1.3 分析kmemleak泄漏情况

    参考文档:

    kmemleak的使用

    Linux Kernel Memory Leak Detection

    Linux memory leak detection

    3.2 valgrind

    Linux C/C++ Memory Leak Detection Tool

    Linux 下几款程序内存泄漏检查工具

    Linux下几款C++程序中的内存泄露检查工具

    Linux 内存泄露检测技巧

    应用 Valgrind 发现 Linux 程序的内存问题

    https://events.linuxfoundation.org/images/stories/pdf/lceu11_marinas.pdf

    http://blog.thewebsitepeople.org/2011/03/linux-memory-leak-detection/

    https://serverfault.com/questions/257759/something-eats-all-memory-i-suspect-memory-leak-on-some-app-how-to-detect-wha

  • 相关阅读:
    find 以及linux 和windows 文件互传
    27 关于Object类 -- equals()
    26 super关键字
    25 访问修饰符限定词
    24 继承 子类中方法重写
    23 static 关键字
    22 包(package)来解决不同包下同名文件的冲突问题
    21 封装(get,set方法)
    20 带参构造方法(this关键字)
    19 无参构造方法
  • 原文地址:https://www.cnblogs.com/arnoldlu/p/6612643.html
Copyright © 2020-2023  润新知