一个C++;应用程序使用的堆比RSS内存多? 我有一个C++的可执行文件,用于多线程应用程序,其中包括打开UDP端口。

一个C++;应用程序使用的堆比RSS内存多? 我有一个C++的可执行文件,用于多线程应用程序,其中包括打开UDP端口。,c++,memory,heap,C++,Memory,Heap,我正在使用不同的工具测量这个应用程序的内存使用情况 根据我对Linux内存使用的理解,RSS=Heap+Stack+Shared+CodeSize 但是,现在我认为等式是错误的,因为我的应用程序有: 峰值堆使用率:40Mb 峰值RSS:30Mb 我用不同的工具测量了数字(valgrind,heaptrack,top),所以我可以说它们是正确的 怎么可能呢? 这种情况的原因和后果是什么 谢谢,正如@user4581301在评论中指出的那样,我对RSS的想法有一个问题 HEAP=DynamicM

我正在使用不同的工具测量这个应用程序的内存使用情况

根据我对Linux内存使用的理解,
RSS=Heap+Stack+Shared+CodeSize

但是,现在我认为等式是错误的,因为我的应用程序有:

  • 峰值堆使用率:40Mb
  • 峰值RSS:30Mb
我用不同的工具测量了数字(
valgrind
heaptrack
top
),所以我可以说它们是正确的

怎么可能呢? 这种情况的原因和后果是什么


谢谢,

正如@user4581301在评论中指出的那样,我对RSS的想法有一个问题

HEAP=DynamicMemoryAllocated

RSS=DynamicMemoryInitialized+Stack+Shared+CodeSize

因此,并非所有堆大小都包含在RSS中,而是仅包含已初始化的部分

如果为10Mb阵列分配空间,这就是堆。
如果您开始初始化它,那么初始化的部分将被视为RSS。

正如@user4581301在评论中指出的,我对RSS的理解存在问题

HEAP=DynamicMemoryAllocated

RSS=DynamicMemoryInitialized+Stack+Shared+CodeSize

因此,并非所有堆大小都包含在RSS中,而是仅包含已初始化的部分

如果为10Mb阵列分配空间,这就是堆。 如果您开始初始化它,那么初始化的部分将被计为RSS。

RSS是常驻集大小

并非所有堆都必须是驻留的—例如,它可能会被调出

但是,虚拟内存使用将包括所有堆(驻留和非驻留部分)。

RSS是驻留集大小

并非所有堆都必须是驻留的—例如,它可能会被调出


但是,虚拟内存的使用将包括堆的所有部分(包括驻留部分和非驻留部分)。

如果我很了解RSS,这就是某个时间点使用的RAM总量。因此,这只意味着程序的所有地址空间都不会全部加载到RAM中。肯定有一部分在交换中。RSS是指内存中实际存在的内存量。程序分配的内存可能还不在RAM中或不再在RAM中,这有很多原因。这都是因为,在peek期间,一些页面位于交换分区上,因为它们更可能不被代码使用(冷区)内核理解这一点,并将其从RAM移动到HDD。@SergeiKurenkov在我的应用程序执行期间,
top
中的
SWAP
列始终显示
0
。已分配但尚未使用的内存将不会分配主内存。如果您分配了一个巨大的数组,您可能看不到RSS的增加。如果您访问数组中的第一个和最后一个元素,您可能只会在RSS中看到包含第一个和最后一个元素的页面,而在RSS中不包含任何元素。如果我很了解RSS,这就是某个时间点使用的RAM总量。因此,这只意味着程序的所有地址空间都不会全部加载到RAM中。肯定有一部分在交换中。RSS是指内存中实际存在的内存量。程序分配的内存可能还不在RAM中或不再在RAM中,这有很多原因。这都是因为,在peek期间,一些页面位于交换分区上,因为它们更可能不被代码使用(冷区)内核理解这一点,并将其从RAM移动到HDD。@SergeiKurenkov在我的应用程序执行期间,
top
中的
SWAP
列始终显示
0
。已分配但尚未使用的内存将不会分配主内存。如果您分配了一个巨大的数组,您可能看不到RSS的增加。如果访问数组中的第一个和最后一个元素,则在RSS中可能只会看到包含第一个和最后一个元素的页面,而不包含任何元素。