C++ 应用程序如何使用比 RSS 内存更多的堆?
How can a C++ application use more Heap than RSS Memory?
我有一个涉及打开 UDP 端口的多线程应用程序的 C++ 可执行文件。
我正在使用不同的工具测量此应用程序的内存使用情况。
根据我对 Linux 内存使用情况的理解,RSS = Heap + Stack + Shared + CodeSize
。
但是,现在我认为等式是错误的,因为我的申请有:
- 堆使用峰值:40Mb
- 峰值 RSS:30Mb
我用不同的工具(valgrind
、heaptrack
、top
..)测量了这些数字,所以我可以说它们是正确的。
这怎么可能?
造成这种情况的原因和后果是什么?
谢谢
正如@user4581301 在评论中指出的,我对 RSS 的理解有问题。
HEAP = DynamicMemoryAllocated
RSS = DynamicMemoryInitialized + Stack + Shared + CodeSize
所以并不是所有的堆大小都包含在 RSS 中,而是只包含已初始化的部分。
如果为 10Mb 数组分配 space,这就是 HEAP。
如果你开始初始化它,那么初始化的部分将被算作RSS。
RSS 是 常驻 设置大小。
并非所有堆都必须驻留 - 例如,它可能会被换出。
但是,虚拟 内存使用量将包括所有堆(驻留和非驻留部分)。
我有一个涉及打开 UDP 端口的多线程应用程序的 C++ 可执行文件。
我正在使用不同的工具测量此应用程序的内存使用情况。
根据我对 Linux 内存使用情况的理解,RSS = Heap + Stack + Shared + CodeSize
。
但是,现在我认为等式是错误的,因为我的申请有:
- 堆使用峰值:40Mb
- 峰值 RSS:30Mb
我用不同的工具(valgrind
、heaptrack
、top
..)测量了这些数字,所以我可以说它们是正确的。
这怎么可能? 造成这种情况的原因和后果是什么?
谢谢
正如@user4581301 在评论中指出的,我对 RSS 的理解有问题。
HEAP = DynamicMemoryAllocated
RSS = DynamicMemoryInitialized + Stack + Shared + CodeSize
所以并不是所有的堆大小都包含在 RSS 中,而是只包含已初始化的部分。
如果为 10Mb 数组分配 space,这就是 HEAP。 如果你开始初始化它,那么初始化的部分将被算作RSS。
RSS 是 常驻 设置大小。
并非所有堆都必须驻留 - 例如,它可能会被换出。
但是,虚拟 内存使用量将包括所有堆(驻留和非驻留部分)。