【发布时间】:2012-12-12 03:57:44
【问题描述】:
我为工作编写的程序需要跟踪它自己使用的内存。但是它不能作为一个整体监控它的内存使用情况,我需要它来监控程序中的每个对象以及该对象正在使用多少内存,这样它就可以告诉该对象在上面使用时减少内存使用一定的能力。监控内存使用的部分持有一个指向所有已创建对象的指针,并通过调用该对象上返回对象大小的方法来跟踪它们的内存使用情况。
我遇到的问题是我无法准确计算所用内存的大小。我的计算是否有一点偏差并不重要,但我的差异很大。我的程序计算的大小在程序实际内存使用量的 1/2 到 2/3 之间变化(取决于程序执行的操作)。例如,一个使用 3.35gb 内存的程序被计算为仅使用 2.16gb。
我目前计算对象大小的方法是,将 sizeof(*this) 添加到对象中任何向量或数组的长度乘以向量/数组中元素的大小。
我计算所用内存的方式有问题吗?还是还有其他我没有考虑到的事情?如果有人知道一个程序,您可以通过程序的不同方面分析内存使用情况,这也将非常有帮助,这样我就可以追踪所有这些额外内存的来源(最好是可以在没有 GUI 的 Linux 上运行的程序)我使用的是 Ubuntu 服务器,但也有一台可以使用的 windows 机器。
【问题讨论】:
-
你在这些向量中保留了哪些对象?如果这些对象动态分配内存(使用
new、malloc等),sizeof将不会考虑由此消耗的空间。 -
问题可能来自您正在使用的程序告诉您已为您的应用程序分配了多少内存(而不是您的代码进行计算)。问题是该程序正在添加操作系统已分配给您的应用程序的页面总和。然后运行时使用分配的页面进行自己的内存管理(并非所有内存都可能分配给对象)。
-
一件简单的事情:如果你的很多内存都在向量中,请记住使用它们的容量而不是它们的大小来估计实际内存“使用”(即虚拟地址的占用)而不是理论内存使用情况(实际使用的内存有用)。由于容器开销,其他容器要贵得多(通常每个元素有几个指针,当元素是像整数这样的小对象时,这会很快加起来。)
-
在我这样计算的向量中,我只保存原始数据类型或包含原始数据类型的结构。
-
向量没有问题(但请记住使用容量,而不是大小)。我指的是其他容器,例如 std::map,甚至是 std::list。