一个C++;应用程序使用的堆比RSS内存多? 我有一个C++的可执行文件,用于多线程应用程序,其中包括打开UDP端口。
我正在使用不同的工具测量这个应用程序的内存使用情况 根据我对Linux内存使用的理解,一个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
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中可能只会看到包含第一个和最后一个元素的页面,而不包含任何元素。