我有一个运行(私有)服务器,它使用大约1.1G虚拟内存(1.0G物理内存)。虽然我有服务器的源代码,但我想找出任何更好的解决方案,我可以使用它来了解服务器中对象之间的内存分布的大图?有点像这样:
HashTable: 50%, 500M
PlayerCache: 20%, 200M
OtherA: 10%, 100M
...
其中指针可以在对象中并指向动态分配的记忆。
答案 0 :(得分:-1)
在Linux上,您可以使用proc(5)和pmap(1)(BTW,pmap(1),top(1),ps(1)全部使用/proc/
并且对你有用。)
因此,如果您的服务器process有pid 1234,您可以在终端中尝试pmap 1234
和cat /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 new
和delete
。堆内存消耗是一个完整的程序属性(并且没有绑定,一般,属于特定的类型或变量)。有些程序有自己的(特定类型的)allocators或使用基于竞技场或region based allocation。
另请阅读有关garbage collection的内容,例如GC handbook,以获取有用的概念和术语和技巧(例如tracing GC,reference counting,weak references,circular references,smart pointers等。 )。它们对manual memory management来说很重要。
内存管理和分配特定于每个程序,特别是在C或C ++(或Rust)等编程语言中,具有手动内存管理,其中约定非常重要,并且特定于每个程序。研究现有各种free software服务器的源代码(例如Apache,Lighttpd,PostGreSQL,Xorg,Unison,Git ,...)你会发现他们每个人都有不同的内存管理惯例。