zoukankan      html  css  js  c++  java
  • 内存使用过高点检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,优先使用动态库

  • 相关阅读:
    迈步从头越
    C 语言中用bsearch()实现查找操作
    ASP.NET 远程调试
    JsonHelper
    json数据中包含html代码的解决方法
    js对url的常见操作
    jquery中ajax中get和post的用法
    图片和文件合成为图片的方法(黑客)
    数据库分库知识
    长链接转短链接的方法(百度、新浪、腾讯)
  • 原文地址:https://www.cnblogs.com/yuzhenjin/p/14018704.html
Copyright © 2011-2022 走看看