有人可以清楚地解释我们从Solaris中的prstat获得的SIZE和RSS值的含义吗?
我写了一个测试C ++应用程序,用new[]
分配内存,填充它并用delete[]
释放它。
据我所知,SIZE值应该与进程“保留”了多少虚拟内存有关,即内存“malloced”或“newed”。
除非我真的使用它(填充一些值),否则内存不会在RSS值中总结。但即使我释放内存,RSS也不会掉线。
我不明白我能正确分配给这两个值的语义。
答案 0 :(得分:5)
RSS(AFAIK可靠)表示进程使用的物理内存量。使用Solaris默认内存分配器,释放内存对RSS没有任何作用,因为它只是更改了一些指针和值来告诉内存可以自由重用。 如果你不再通过重新分配来再次使用那个内存,它最终将被分页并且RSS将会丢失。
如果要在释放后立即返回释放的内存,可以使用Solaris mmap分配器,如下所示:
export LD_PRELOAD=libumem.so
export UMEM_OPTIONS=backend=mmap
答案 1 :(得分:1)
大小是进程的总虚拟内存大小,包括所有映射的文件和设备, RSS 应该是驻留集大小,但是完全不可靠,你应该尝试从 pmap 获取该信息。
答案 2 :(得分:0)
作为一般规则,一旦将内存分配给进程,它将永远不会返回给操作系统。在Unix系统上,sbrk()调用用于扩展进程地址空间,并且没有类似的调用去另一个方向。