3

我正在为工作编写的程序需要跟踪其自身使用的内存。但是它不能整体监控它的内存使用情况,我需要它来监控程序中的每个对象以及该对象正在使用多少内存,这样它就可以告诉该对象在使用上面的情况下减少内存使用一定的能力。监控内存使用的部分持有一个指向所有已创建对象的指针,并通过调用该对象上返回对象大小的方法来跟踪它们的内存使用情况。

我遇到的问题是我无法准确计算所用内存的大小。我的计算是否有一点偏差并不重要,但我的差异很大。我的程序计算的大小在程序实际内存使用量的 1/2 到 2/3 之间变化(取决于程序执行的操作)。例如,使用 3.35gb 内存的程序被计算为仅使用 2.16gb。

我计算对象大小的当前方法是将 sizeof(*this) 添加到对象中任何向量或数组的长度乘以向量/数组中元素的 sizeof。

我计算所用内存的方式有问题吗?还是还有其他我没有考虑到的事情?如果有人知道一个程序,您可以通过程序的不同方面分析内存使用情况,这也将非常有帮助,这样我就可以追踪所有这些额外内存的来源(最好是可以在没有 GUI 的 Linux 上运行的程序)我使用的是 Ubuntu 服务器,但也有一台我可以使用的 Windows 机器)。

4

1 回答 1

2

我计算所用内存的方式有问题吗?

是的。首先,您的程序所消耗的内存大小可能不会在任何时候完全使用。例如,在向量调整大小之后,旧的内存块可能会返回给系统。或者它可能会在下次有人请求相同大小的内存块时被堆保留。

另外,请记住,您使用的任何库(例如 OS API)都会分配内存,而这些东西不是免费的。

还要记住,堆管理器会为每个内存分配带来额外的开销;通常在每个分配的一个或两个指针的顺序上。

如果您想跟踪应用程序中的内存使用情况,请为此使用真正的内存分析器。如果您想动态扩展程序首先分配的内存量,请使用分析器来计算您正在处理的一个对象占用的平均大小,然后限制对象数量而不是内存大小。

于 2012-12-12T04:03:42.843 回答