我想知道给定数据结构消耗了多少内存。所以假设我有一个并发链表。我想知道这个列表有多大。我有几个选项:malloc_hooks
,我不认为是线程安全的,和getrusage
's ru_maxrss
,但我真的不知道这给了我什么(整个进程在执行过程中消耗了多少内存?)。我想知道是否有人以这种方式实际测量过内存消耗。有没有工具可以做到这一点?massif
票价如何?
2 回答
malloc
要了解某些结构(例如链表节点)实际花费了多少字节,请创建一个隔离的测试用例(非并发!),它分配了数千个,并查看程序内存使用中的增量值。有多种方法可以做到这一点。如果您的库具有mallinfo
结构,例如 GNU/Linux 系统上的 GNU C 库,您可以查看之前和之后的统计信息。另一种方法是跟踪程序的系统调用以观察其从操作系统分配的模式。例如,如果我们分配了 10,000,000 个列表节点,并且程序执行了sbrk()
大约 39,000 次调用,每次调用将进程大小增加 8192 字节,那么这意味着一个列表节点占用了 32 个字节、开销等等。
请记住,在单个线程中分配数千个相同大小的对象并不能真实地代表现实程序中的实际内存使用情况,其中包括碎片。
如果您想分配小结构并接近不浪费一个字节(或不造成任何您不知道和控制的浪费),并控制碎片,那么从malloc
(或您的系统分配器)分配大型对象数组选择)并自己分解它们。中仍然存在未知开销,malloc
但它被划分为大量对象,因此可以忽略不计。
或者,一般来说,编写自己的分配器,您可以详细了解其行为和开销,并且它本身会从系统中占用大量资源。
从概念上讲,您需要知道您正在使用的项目数量。然后,您需要知道数据结构中使用的每种不同数据类型的大小。您还必须考虑指针的大小或任何使用某种内存的东西。
然后你可以想出一个如下所示的公式:
消耗 = N *(sizeof(data types) )。
因此,换句话说,您要确保将任何数据类型(数据类型的大小)相加并乘以项目数。