减少大型不熟悉的代码库的内存占用

时间:2008-09-23 18:28:18

标签: c++ winapi optimization visual-c++ memory-management

假设您有一个相当大的(~2.2 MLOC),相当陈旧(在10年前开始)使用C / C ++的Windows桌面应用程序。大约10%的模块是外部的,没有源,只有调试符号。

您如何将应用程序的内存占用减少一半?至少,你会怎么做才能找到消耗内存的地方?

7 个答案:

答案 0 :(得分:7)

用包装器覆盖malloc()/ free()和new()/ delete(),这些包装器跟踪分配的大小,并且(通过记录callstack并稍后根据符号表对其进行解析)来自哪里。关闭时,让您的包装器显示仍然分配的任何内存。

这应该使您能够找出最大分配的位置并捕获任何泄漏。

答案 1 :(得分:3)

this is description/skeleton内存跟踪应用程序我曾经将游戏的内存消耗减少了20%。它帮助我跟踪外部模块完成的许多分配。

答案 2 :(得分:2)

这不是一件容易的事。首先追逐你可以找到的任何内存泄漏(一个好的工具是Rational Purify)。浏览源代码并尝试优化数据结构和/或算法 很抱歉,如果这听起来很悲观,但减少50%的内存使用率听起来并不现实。

答案 3 :(得分:1)

你有可能很快找到一些重要的低效率。首先,你应该检查用于什么的内存。我发现一个非常方便的工具是Memory Validator

获得此“内存使用情况地图”后,您可以查看“低挂果”。是否有任何数据结构消耗大量内存,可以用更紧凑的形式表示?这通常是可能的,尤其是当数据访问被很好地封装并且你有一个备用CPU电源时,你可以专门在每次访问时压缩/解压缩它们。

答案 4 :(得分:0)

我不认为你的问题很好。

源代码的大小与内存占用量没有直接关系。当然,编译后的代码会占用一些内存,但应用程序可能会有内存需求。静态(代码中声明的变量)和动态(应用程序创建的对象)。

我建议您分析程序执行情况并仔细研究代码。

答案 5 :(得分:0)

首先要开始的地方是:

应用程序是否会执行大量预分配内存以供以后使用?这种记忆常常是未使用的,从未分发过吗?考虑根据需要切换到新建/删除(或更好地使用smart_ptr)。

代码是否使用静态数组,例如

Object arrayOfObjs[MAX_THAT_WILL_EVER_BE_USED];

并在此数组中分发objs?如果是这样,请考虑手动管理此内存。

答案 6 :(得分:0)

内存使用分析的工具之一是LeakDiag,可用于free download from Microsoft。它显然允许将所有用户模式分配器挂钩到VirtualAlloc,并随时将进程分配快照转储到XML。然后,这些快照可用于确定哪些调用堆栈分配大多数内存以及哪些调用堆栈正在泄漏。它缺少快照分析的前端(除非您可以通过Microsoft Premier Support获得LDParser / LDGrapher),但所有数据都在那里。

还有一点需要注意的是,由于缓存,您可能会因BSTR分配器而出现漏报,请参阅"Hey, why am I leaking all my BSTR's?"