我需要在linux进程中对已分配的内存进行可靠的测量。我一直在研究mallinfo,但我读过it is deprecated。这种统计数据的最新替代方案是什么?
基本上我对至少两个数字感兴趣:
任何malloc
或任何使用所选C库的实现从内核分配的内存块/页面的数量(和大小)
(可选但仍然很重要)按用户空间代码(通过malloc
,new
等)分配的内存数量减去它释放的内存(通过free
, delete
等。)
我有一种可能性是override malloc calls with LD_PRELOAD,但它可能会在运行时引入不必要的开销,也可能无法与我正在使用的其他库正确交互,这也依赖于LD_PRELOAD aop-ness。
我读过的另一种可能性是rusage。
要清楚,这是 NOT 用于调试目的,内存使用是应用程序的固有功能(类似于Mathematica或Matlab,显示使用的内存量,只有更准确的块级)
答案 0 :(得分:4)
为此目的 - 应用程序中的“内存使用”内省功能 - 最合适的接口是malloc_hook(3)
。这些是GNU扩展,允许您挂钩每个malloc()
,realloc()
和free()
来电,维护您的统计信息。
要查看应用程序从内核的角度映射了多少内存,您可以在/proc/self/smaps
伪文件中读取和整理信息。这也可以让你看到每个分配有多少是驻留,交换,共享/私有,清理/脏等等。
答案 1 :(得分:3)
/proc/PID/status
包含一些有用的信息(例如,尝试运行cat /proc/$$/status
)。
VmPeak
是您的进程在执行期间所拥有的最大虚拟内存空间。这包括映射到您的进程的所有页面,包括可执行页面,mmap文件,堆栈和堆。
VmSize
是进程虚拟内存空间的当前大小。
VmRSS
是您流程的常驻设置大小;即,现在有多少占用了物理RAM。 (一个典型的过程会有许多映射它从未使用过的东西,就像大多数C库一样。如果没有进程需要一个页面,最终它将被驱逐并变为非驻留.RSS测量仍然驻留并映射的页面进入你的过程。)
VmHWM
是VmRSS
的高水位线;即该过程有效期内最高的数字。
VmData
是流程“数据”细分的大小;即大致其堆使用情况。请注意,从内核的角度来看,您已经使用malloc
然后free
的小块仍将被使用;释放时,实际上会将大块返回给内核。 (如果内存服务,“大”意味着当前glibc大于128k。)这可能是你最接近你想要的。
这些测量可能比尝试跟踪malloc和free更好,因为它们从系统范围的角度指出了“真正发生的事情”。仅仅因为您在某些内存上调用了free()
,这并不意味着它已被返回到系统以供其他进程使用。