正在运行的程序按照内存段来组织,内存段的类型有如下几种:

  • 代码段:用户程序指令,长期存在内存中

  • 数据段:全局变量等,长期存在内存中

  • 堆:局部变量,参数参数等,短期存在内存中

  • 栈:动态存储,可变

代码段

  • 问题1:是否存在无用代码片段(函数,变量),无用全局变量,无用的类私有变量等

    • 点检手段: 通过静态检测工具来分析,或者人工grep的方法

    • 改进手段:直接删除

  • 问题2:是否存在大量的代码片段宏

    • 点检手段:IDE,分析源文件

    • 改进手段:用函数来代替宏

  • 问题3:是否存在大量重复代码

    • 点检手段:通过静态检测工具查看源码重复之处

    • 改进手段:提取共同函数来消除重复

数据段

  • 问题1:是否存在创建非必要临时文件的情况

    • 点检手段:通过命令du -sh /tmp/* 来查看,是否存在一些无用的文件是本进程创建的。

    • 改进手段:删除无用的文件

  • 问题2:进程是否直接使用大量RAW data

    • 点检手段:查看源码

    • 改进手段:使用压缩过后的数据

  • 问题3:全局变量作用域是否可以减少(尤其是只在某一处或者几处地方使用而已)

    • 点检手段:静态检测工具

    • 改进手段:优化程序逻辑,全局变量变局部变量

  • 问题4:是否存在不合理的数据结构(尤其是size很大的全局变量)

    • 点检手段:分析源码

    • 改进手段:优化数据结构

  • 问题5:是否存在不合理的预留,尤其是项目初期由于信息缺少,数据结构存在预留空间/字段。

    • 点检手段:分析源码中非0,1的魔法数字

    • 改进手段:优化数据结果(消除预留空间/字段)

栈段

  • 问题1:是否存在函数递归调用的使用场景

    • 点检手段:通过静态检测工具来分析,或者开发自己应该很清楚

    • 改进手段:优化程序结构,消除函数递归

  • 问题2:是否存在大的局部变量

    • 点检手段:grep源码:grep -nr "[",搜索使用数组下标的地方,然后一一排查,发现比较大的数组(比如100K以上)就要引起注意了。

    • 改进手段:如果确实必须的,将大局部变量声明为全局,然后按照引用传递给函数

  • 问题3:是否存在函数参数较多的函数(比如超过了6个)

    • 点检手段:静态检测工具

    • 改进手段:函数入参合并

  • 问题4:函数入参是否存在复制的问题

    • 点检手段:grep源码

    • 改进手段:引用而不是值来传递参数

堆段

  • 问题1:是否存在内存泄漏

    • 点检手段:通过脚本定时监控进程内存使用情况;通过工具点检

    • 改进手段:智能指针代替裸指针, ...

  • 问题2:是否存在文件句柄增加或者进程使用文件句柄太多(和设计不符)

    • 点检手段:查看用户级最大文件描述限制:ulimit -n; 通过查看 /proc/pid/fd,查看进程占有文件句柄数是否存在增加的情况;通过静态检测工具查看是否存在文件资源泄漏的情况

    • 改进手段:消除文件资源泄漏

  • 问题3:STL中Vector容器内存未释放(vector跟其它容器不同,即使调用了clear()函数,内存依然不会释放,除非调用swap()函数/shrink_to_fit()函数)

    • 点检手段:grep源码

    • 改进手段:使用其它的STL容器替代Vector,或者调用clear函数后还需要调用swap函数等

系统

  • 问题1:进程的线程数是否动态增加或者线程数和设计不符合

    • 点检手段:ps -T -p <pid>或者top -H

    • 改进手段:优化线程动态参见部分逻辑

  • 问题2:是否存在周期性调用系统shell指令的情况

    • 点检手段:grep -nr system; grep -nr popen

    • 改进手段:采用系统API代替shell脚本

  • 问题3:makefile存在不合理,链接了不使用的动态库或者静态库

    • 点检手段:分析makefile

    • 改进手段:优化makefile,链接时去掉非必要的动态库

  • 问题4:makefile中存在优先使用静态库代替动态库的情况

    • 点检手段:分析makefile

    • 改进手段:优化makefile,优先使用动态库

内存使用过高点检checklist的更多相关文章

  1. C++内存泄露检測原理

    转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...

  2. VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)

    http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...

  3. 转载:c++内存泄露机制

    对于一个c/c++程序猿来说,内存泄漏是一个常见的也是令人头疼的问题.已经有很多技术被研究出来以应对这个问题,比方 Smart Pointer,Garbage Collection等.Smart Po ...

  4. JavaScript语言基础4

    谈谈JavaScript 中的变量. 在JavaScript 中使用变量的优点:变量保存在计算机的内存中,变量很适合于保存暂时性的数据 ,变量仅仅具有有限的生存期,当 用户关闭了页面或者打开一个新的页 ...

  5. Visual C++ 2012/2013的内存溢出检測工具

    在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...

  6. c++程序内存泄露检測工具

    功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...

  7. Linux C 编程内存泄露检測工具(二):memwatch

    Memwatch简单介绍 在三种检測工具其中,设置最简单的算是memwatch,和dmalloc一样,它能检測未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http: ...

  8. 内存泄露检測及cvClone造成的泄露

    调了几个小时,到最后发现内存泄露的原因是opencv的cvClone函数,採用cvCopy函数后,问题解决. vs2010使用vld进行内存泄露检測 (1) 下载vld工具 (2) 将D:\Progr ...

  9. Visual Studio内存泄露检測工具

    使用简单介绍     在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...

随机推荐

  1. centos6.8 Mysql5.6.22 升级 mysql-5.7.20

    一.检查系统环境 二.备份数据库 mysqldump –all-databases > allbackupfile.sql (建议:有条件的话可使用图形化界面备份,操作灵活) 三.下载安装文件 ...

  2. CPU 底层运算之乘法运算

    CPU 运算加减法运算 假设计算  3+3  原码是0011 * 0011(以4位存贮单元,因为是原码,最高位不代表符号位) 1. 首先 判断 两个加数是否有 负数(减法)  如果有 负数 先将负数转 ...

  3. hasmap hashtable

    hashMap和hashtable方面的知识点吧: 1. 关于HashMap的一些说法: a) HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体.HashMa ...

  4. java面试之手写单例模式

    为什么要有单例模式 实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象.缓存.系统全局配置对象等.这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源. 实现单例模式的几个 ...

  5. 助力全球抗疫:3D突发公共卫生事件管理平台

    前言 秋冬降临,北半球气温转凉.欧洲多个国家单日新增病例持续创新高,美国更是成为全球疫情最严重的国家.国内山东青岛.新疆喀什等地也相继发现多例病情.全球第二波疫情已经开始,国内疫情牵动人心,全球抗疫仍 ...

  6. B. Game of the Rows 解析(思維)

    Codeforce 839 B. Game of the Rows 解析(思維) 今天我們來看看CF839B 題目連結 題目 有如下圖片所示的飛機座位\(n\)排,和\(k\)隊士兵,每隊數量不一定. ...

  7. 在VirtualBox中调整Raspbian分辨率

    参考自一路阳光随行发表的virtualBox设置虚拟机分辨率大小中ubuntu虚拟机分辨率的设置方法. 启动Raspbian虚拟机,点击 窗口主菜单里的设备->安装增强功能.系统后会自动挂载增强 ...

  8. 《Head First 设计模式》:与设计模式相处

    正文 一.设计原则 1.封装变化 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,不针对实现编程 "针对接口编程"真正的意思是& ...

  9. 删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件:BAT + VBS

    代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除. ::本例调用了临时VBS ...

  10. Docker(10)- docker create 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器但不启动它 ...