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