我正在开发一个基于Linux的程序,它以共享对象的形式加载许多插件。我想知道的是每个共享对象及其所有数据结构在特定时间点占用多少内存。有可能吗?如果需要,我可以修改主程序和插件共享对象。
答案 0 :(得分:2)
动态化是不可能的,因为共享对象A.so
可能会在运行时动态创建一些对象数据B,然后由共享对象C.so
销毁。
所以你不能说像B这样的某些数据“属于”一个特定的共享对象;你可能(而且应该)有约定。请参阅RAII,rule of three,smart pointers,....
重点是“给定库或共享对象使用了多少内存”这个问题没有任何意义。内存和地址空间是整个过程,因此主程序和所有共享对象,库,插件共享......!
但是,您可以使用proc(5)获取有关整个过程的信息。从程序内部,按顺序读取/proc/self/maps
以获取其地址空间的映射。在程序外部,请阅读/proc/1234/maps
以获取pid 1234的过程。
您可能想要使用valgrind。详细了解memory management,garbage collection,reference counting。您可以查看与resource management或garbage collection相关的问题。您可能想要使用Boehm's conservative garbage collector(如果使用标准C ++容器,您将要使用Boehm gc_allocator
,请参阅this)。关键是某些给定数据的活跃度是程序的全局属性,而不是任何特定插件或函数的属性。想想circular references
答案 1 :(得分:1)
我想知道的是每个共享对象的内存量是多少 它的数据结构,在某个时间点。可能吗 这样做?
如果程序正在运行且你有它的pid,你可以检查它的内存映射。例如:
% pmap 1234
[...]
00007f8702f6a000 148K r-x-- libtinfo.so.5.9
00007f8702f8f000 2044K ----- libtinfo.so.5.9
00007f870318e000 16K r---- libtinfo.so.5.9
[...]
但这并没有告诉你很多关于数据结构的信息。