我有一个C++的多线程应用程序的可执行文件,它涉及UDP端口的打开。
我正在使用不同的工具测量此应用程序的内存使用情况。
根据我对 Linux 内存使用情况的理解,RSS = Heap + Stack + Shared + CodeSize
.
但是,现在我认为这个等式是错误的,因为我的应用程序有:
- 峰值堆使用量:40Mb
- 峰值 RSS:30Mb
我用不同的工具(valgrind
、heaptrack
、top
等(测量了这些数字,所以我可以说它们是正确的。
怎么可能?这种情况的原因和后果是什么?
谢谢
正如@user4581301在评论中指出的那样,我对RSS的想法存在问题。
HEAP = DynamicMemoryAllocated
RSS = DynamicMemoryInitialized + Stack + Shared + CodeSize
因此,并不是所有的堆大小都包含在 RSS 中,而只包含已初始化的部分。
如果为 10Mb 阵列分配空间,则这就是堆。如果您开始初始化它,则初始化的部分将计为 RSS。
RSS 是常驻集大小。
并非所有堆都一定是常驻的 - 例如,它可能会被换掉。
但是,虚拟内存使用情况将包括所有堆(常驻和非驻留部分(。