1

我需要尽可能多地削减内存。我正在使用带有 STL 的标准 C++。该程序没有做太多(还),它仍然需要 960Kb [根据top]!可执行文件大小仅为 64KB。

代码有 3000 行长,我显然不会发布。我相信问题不在于我的代码,而在于系统库。

一个 main() 函数(包括我的所有代码但不使用它)使用 732Kb 的 RAM
简单代码:

int main() {
sleep(1000); //do nothing
return 0;
}
//Uses 732kb of RAM

我的代码没有全局变量(除了对我隐藏的库中的变量)。

我正在使用标准库:libstdc++ (STL)、GNU libc。还有一个 BSD 套接字和 libev 以及非标准的 STL 绳索类。

我可以运行一些内存分析器吗?

平台:Linux 2.6.18-32,32 位处理器,16MB 总系统 RAM,无可用交换
编译器:GCC 4
标准库:GCC 的 libstdc++
编译器选项:-Os(无调试符号)

没有大量使用模板:容器和迭代器仅此而已。但是,我正在大量使用 SGI STL 绳索类。

测试环境是运行 Linux 的基本服务器,内存为 128MB,Pentium III 667 Mhz,CentOS 5.5,无仿真。

更新:我想知道库本身(代码大小)是否导致问题。共享库不需要加载到 RAM 中吗?

4

4 回答 4

2

开始剥离功能,直到内存使用量下降。首先走极端——如果你可以替换mainsleep(1000);并且你的内存使用仍然很高,请查看代码和静态数据——在全局范围内初始化的任何内容或类或函数内的静态,以及不同类型的模板实例化和调试符号。

更新:删除了关于 STL 分配器的不正确评论。它可能适用于其他编译器/STL 版本(如果您想查看历史记录,请查看),但不适用于此问题。

请注意malloc/operator new通常会吝啬将空闲内存还给操作系统,这将导致您的程序作为一个整体不会随着时间的推移而缩小其明显的使用量;该内存将通过未来的分配在整个程序中重复使用,因此除了将“内存使用”数字无限期地保持在或接近其高水位线之外,这通常不是一个大问题。

于 2011-04-06T17:54:40.477 回答
2

更新:我想知道库本身(代码大小)是否导致问题。共享库不需要加载到 RAM 中吗?

答对了。至少在 Mac OS X 上,Top 在物理内存使用中包含共享库的大小。当然,每个库只有一个副本驻留在内存中。

检查文档以top获取解决方法,或者只是将其丢弃并使用malloc_info(). 不过,要小心找到一种方法来说明代码、堆栈和全局使用情况。

于 2011-04-06T18:17:45.920 回答
1

获取链接器以发出链接映射文件;您可以使用它来准确确定您的代码需要多少静态链接代码和静态数据空间。

堆栈、堆空间和共享库是附加的,并在运行时分配。

如果您有 16Mb 的 RAM,这真的很重要吗?可能存在相对较大但固定的开销,并且您的整体内存占用不会随着添加的代码行线性增长。

于 2011-04-08T18:35:50.343 回答
0

由于目标是 linux,我认为您可以通过查看 /proc/{pid_number} 中的地图和 smaps 文件来了解内存使用的详细信息,特别是共享库组件

于 2011-04-11T16:54:14.067 回答