Использование памяти загруженными общими объектами

0

Я работаю над Linux-программой, которая загружает много плагинов в виде общих объектов. Я хочу узнать, сколько памяти каждый общий объект и все его структуры данных занимают в определенный момент времени. Можно ли это сделать? При необходимости я могу изменить как основную программу, так и подключаемые общие объекты.

  • 0
    Над какой программой вы работаете?
  • 0
    Это какой-то анализатор данных.
Теги:
shared-libraries
memory-management

2 ответа

2
Лучший ответ

Это невозможно динамически, так как может случиться так, что общий объект A.so динамически создает во время выполнения некоторые данные объекта B, которые затем уничтожаются совместно используемым объектом C.so Таким образом, вы не можете сказать, что некоторые данные типа B "принадлежат к" конкретный общий объект; вы можете (и должны) иметь соглашения об этом. См. RAII, правило три, умные указатели ,....

Дело в том, что вопрос "сколько памяти используется данной библиотекой или общим объектом" не имеет смысла.Память и адресное пространство являются глобальными для процесса, поэтому разделяются основной программой и всеми общими объектами, библиотеками, плагинами...!

Однако вы можете использовать proc (5) для получения информации обо всем процессе. Изнутри программы читайте последовательно /proc/self/maps чтобы получить карту своего адресного пространства. С внешней стороны программы читайте /proc/1234/maps для процесса pid 1234.

Вы можете использовать valgrind. Подробнее об управлении памятью, сборке мусора, подсчете ссылок. Вы можете просмотреть свои проблемы, связанные с управлением ресурсами или сбором мусора. Возможно, вы захотите использовать консервативный сборщик мусора Boehm (если вы используете стандартные контейнеры C++, вы захотите использовать Boehm gc_allocator, см. Это). Дело в том, что жизнеспособность некоторых данных является глобальным свойством программы, а не каким-либо конкретным плагином или функцией. Подумайте о круговых ссылках

  • 0
    Ах, ну, я думаю, это стоило попробовать! Похоже, я должен рассмотреть ручной учет или что-то.
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
[...]

Это не говорит вам о структурах данных и т.д.

  • 0
    Обратите внимание, что pmap просто печатает /proc/1234/maps
  • 0
    @BasileStarynkevitch Я знаю, и, по-видимому, каждый, кто использует его, знает, как связать его, чтобы узнать, что он читает. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню