已加载共享对象的内存使用情况
Memory usage of loaded shared objects
我正在开发一个基于Linux的程序,该程序以共享对象的形式加载许多插件。我想知道的是,每个共享对象及其所有数据结构在某个时间点占用了多少内存。有可能做到吗?如果需要,我可以修改主程序和插件共享对象。
这是不可能动态的,因为共享对象A.so
可能在运行时动态创建一些对象数据B,然后被共享对象C.so
使用并销毁所以你不能说像B这样的数据"属于"一个特定的共享对象;您可能(也应该)对此有约定。参见RAII,三规则,智能指针。。。。
关键是"给定的库或共享对象使用了多少内存"这个问题毫无意义。内存和地址空间对进程来说是全局的,因此由主程序和所有共享对象、库、插件共享
但是,您可以使用proc(5)来获取有关整个过程的信息。从程序内部依次读取/proc/self/maps
,得到其地址空间的映射。从程序外,读取pid 1234进程的/proc/1234/maps
。
你可能想使用valgrind。阅读有关内存管理、垃圾收集和引用计数的更多信息。您可以将问题视为与资源管理或垃圾收集有关。您可能想要使用Boehm的保守垃圾收集器(如果使用标准C++容器,则需要使用Boehmgc_allocator
,请参见此)。关键是,某些给定数据的活跃度是程序的全局属性,而不是任何特定插件或函数的属性。考虑循环引用
我想知道的是每个共享对象有多少内存它的数据结构在某个时间点发生。有可能吗这样做?
如果程序正在运行并且你有它的pid,你可以检查它的内存映射。例如:
% pmap 1234
[...]
00007f8702f6a000 148K r-x-- libtinfo.so.5.9
00007f8702f8f000 2044K ----- libtinfo.so.5.9
00007f870318e000 16K r---- libtinfo.so.5.9
[...]
不过,这并不能告诉你太多关于数据结构等的信息。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 在集合的情况下使用emplace_hint的用例是什么?
- 在没有堆的情况下用两种方法构造对象
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 不能在没有对象的情况下调用成员函数,但我用对象调用函数
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何在没有任何JavaScript知识的情况下用PNaCl编写C++HTML5应用程序
- 如何在不使用开关大小写的情况下用C++编写菜单驱动的程序
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 在没有测试用例的情况下提升单元测试框架
- 在这种情况下,为函数赋值有什么用
- 如何在没有_setmode的情况下用C++输出unicode
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何在不锁定文件的情况下用C++编写文件
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc