内存使用过高点检checklist
正在运行的程序按照内存段来组织,内存段的类型有如下几种:
代码段:用户程序指令,长期存在内存中
数据段:全局变量等,长期存在内存中
堆:局部变量,参数参数等,短期存在内存中
栈:动态存储,可变
代码段:
问题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的更多相关文章
- C++内存泄露检測原理
转自:http://hi.baidu.com/jasonlyy/item/9ca0cecf2c8f113a99b4981c 本文针对 linux 下的 C++ 程序的内存泄漏的检測方法及事实上现进行探 ...
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
- 转载:c++内存泄露机制
对于一个c/c++程序猿来说,内存泄漏是一个常见的也是令人头疼的问题.已经有很多技术被研究出来以应对这个问题,比方 Smart Pointer,Garbage Collection等.Smart Po ...
- JavaScript语言基础4
谈谈JavaScript 中的变量. 在JavaScript 中使用变量的优点:变量保存在计算机的内存中,变量很适合于保存暂时性的数据 ,变量仅仅具有有限的生存期,当 用户关闭了页面或者打开一个新的页 ...
- Visual C++ 2012/2013的内存溢出检測工具
在过去,每次编写C/C++程序的时候,VLD差点儿是我的标配.有了它,就能够放心地敲代码,随时发现内存溢出. VLD最高可支持到Visual Studio 2012.不知道以后会不会支持Visual ...
- c++程序内存泄露检測工具
功能: 用于检測c++程序的内存泄露. 原理: 事实上非常easy,就是通过函数的重载机制,捕获应用程序的new, new[] , delete , delete[], malloc,calloc,f ...
- Linux C 编程内存泄露检測工具(二):memwatch
Memwatch简单介绍 在三种检測工具其中,设置最简单的算是memwatch,和dmalloc一样,它能检測未释放的内存.同一段内存被释放多次.位址存取错误及不当使用未分配之内存区域.请往http: ...
- 内存泄露检測及cvClone造成的泄露
调了几个小时,到最后发现内存泄露的原因是opencv的cvClone函数,採用cvCopy函数后,问题解决. vs2010使用vld进行内存泄露检測 (1) 下载vld工具 (2) 将D:\Progr ...
- Visual Studio内存泄露检測工具
使用简单介绍 在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...
随机推荐
- CentOS7下RabbitMQ服务安装配置 (亲测有效)
erlang 21.3 rabbitmq-server 3.7.14 下载地址 链接: https://pan.baidu.com/s/1g_T1Q_6zpyO3AepS0ZPgYQ 提取码: abq ...
- python中实现格式化输入(史上最简单、最高效的实现方法,不借助任何模块)
今天我在写python作业时突然想到格式化输入一段文字,譬如只需读取输入的前几个字符就行,而不幸的是,python中的输入并没有c中的read().getchar()函数,于是我网上搜了一下,网上的解 ...
- vue-cli 工程目录结构介绍 详细介绍
vue-cli目录结构: vue-cli目录解析: build 文件夹:用于存放 webpack 相关配置和脚本.开发中仅 偶尔使用 到此文件夹下 webpack.base.conf.js 用于配置 ...
- 必须掌握的分布式文件存储系统—HDFS
HDFS(Hadoop Distributed File System)分布式文件存储系统,主要为各类分布式计算框架如Spark.MapReduce等提供海量数据存储服务,同时HBase.Hive底层 ...
- java安全编码指南之:序列化Serialization
目录 简介 序列化简介 注意serialVersionUID writeObject和readObject readResolve和writeReplace 不要序列化内部类 如果类中有自定义变量,那 ...
- 程序员小抄——GitHub 热点速览 Vol.44
作者:HelloGitHub-小鱼干 这周热点是什么?youtube-dl!就是那个超过 72+ star,又因为版权问题被 GitHub 关闭的项目,GitHub Trending 上一篇" ...
- Linux exec族函数解析
背景 在提到 vfork 函数时,我们提到了这个概念.为了更好地学习与运用,我们对exec族函数进行展开. exec函数族 介绍 有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中 ...
- Python+Django实现微信扫码支付流程
Python+Django实现微信扫码支付流程 关注公众号"轻松学编程"了解更多. 获取源码可以加我微信[1257309054],文末有二维码. [微信公众号支付官网]https: ...
- 云服务器部署Python项目(nginx+uwsgi+mysql+项目)
python项目部署到云服务器 关注公众号"轻松学编程"了解更多. 一.硬件准备 云服务器,系统ubuntu_16_04 . 注意:要在安全组中开放Http的80端口. 二.软件准 ...
- 【Redis】Redis 持久化之 RDB 与 AOF 详解
一.Redis 持久化 我们知道Redis的数据是全部存储在内存中的,如果机器突然GG,那么数据就会全部丢失,因此需要有持久化机制来保证数据不会一位宕机而丢失.Redis 为我们提供了两种持久化方案, ...