如何分析流程中的内存分布?

时间:2018-05-05 11:04:55

标签: linux memory memory-management

我有一个运行(私有)服务器,它使用大约1.1G虚拟内存(1.0G物理内存)。虽然我有服务器的源代码,但我想找出任何更好的解决方案,我可以使用它来了解服务器中对象之间的内存分布的大图?有点像这样:

HashTable: 50%, 500M

PlayerCache: 20%, 200M

OtherA: 10%, 100M

...

其中指针可以在对象中并指向动态分配的记忆。

1 个答案:

答案 0 :(得分:-1)

在Linux上,您可以使用proc(5)pmap(1)(BTW,pmap(1)top(1)ps(1)全部使用/proc/并且对你有用。)

因此,如果您的服务器processpid 1234,您可以在终端中尝试pmap 1234cat /proc/1234/maps来了解您的流程virtual address space。另请尝试cat /proc/1234/status

请记住,进程在virtual memory中运行,并且每个进程都有自己的虚拟地址空间,物理RAM是由内核管理的资源。您可能对RSS

感兴趣

您不会有详细说明每种类型或每个变量的动态内存使用量的报告(因为一般没有任何意义:例如,在C中一个给定的malloc内存区域可以通过不同类型的强制转换来解除引用,并且可以通过多个变量间接访问 - 也可以间接访问。如果您的程序使用malloc_stats(3),则可以使用C dynamic memory allocation(它可以提供与内存区域大小相关的统计信息)。

您可以使用valgrind,非常有用来搜寻memory leaks

您可以修改要处理的服务器的源代码,并以特定的方式对其正在执行的heap allocation进行一些记帐。例如,如果使用C ++编写代码,则可以修改类的构造函数和析构函数,以递增和递减某些static或全局计数器,或者提供某些特定于类的operator newdelete 。堆内存消耗是一个完整的程序属性(并且没有绑定,一般,属于特定的类型或变量)。有些程序有自己的(特定类型的)allocators或使用基于竞技场或region based allocation

另请阅读有关garbage collection的内容,例如GC handbook,以获取有用的概念和术语和技巧(例如tracing GCreference countingweak referencescircular referencessmart pointers等。 )。它们对manual memory management来说很重要。

内存管理和分配特定于每个程序,特别是在C或C ++(或Rust)等编程语言中,具有手动内存管理,其中约定非常重要,并且特定于每个程序。研究现有各种free software服务器的源代码(例如ApacheLighttpdPostGreSQLXorgUnisonGit ,...)你会发现他们每个人都有不同的内存管理惯例。