В Linux вы можете использовать proc (5) и pmap (1) (Кстати, pmap (1) , top (1) ) , ps (1) все используют /proc/
и полезны для вас).
Итак, если ваш сервер process имеет pid 1234, вы можете попробовать pmap 1234
и cat /proc/1234/maps
в своем терминале, чтобы понять виртуальное адресное пространство из ваш процесс. Попробуйте также cat /proc/1234/status
Помните, что процессы выполняются в виртуальной памяти , и каждый из них имеет свое собственное виртуальное адресное пространство, и что физическая память является ресурсом, управляемым ядром. Вас может заинтересовать RSS
У вас не будет отчета, детализирующего использование динамической памяти по типу или по переменной (потому что вообще не имеет смысла : например, в C, a данная malloc
область памяти может быть разыменована посредством приведения различных типов и быть доступной - возможно, косвенно - через несколько переменных). Вы можете использовать malloc_stats (3) (это может дать статистику, связанную с размером зон памяти), если ваша программа использует C динамическое выделение памяти .
Вы можете использовать valgrind , очень полезный для поиска утечек памяти .
Вы можете изменить исходный код вашего сервера, чтобы он обрабатывал и определенным образом учитывал выделенное им выделение кучи , которое он выполняет. Например, если вы пишете код на C ++, вы можете изменить конструкторы и деструкторы ваших классов, увеличивая или уменьшая некоторые static
или глобальные счетчики, или предоставляя некоторые специфичные для класса operator new
и delete
. Потребление динамической памяти является свойством всей программы (и оно не привязано, в общем , к конкретному типу или переменной). Некоторые программы имеют свои собственные (специфичные для типа) распределители или используют на основе арены или распределение на основе области .
Прочтите также кое-что о сборке мусора , например справочник GC , чтобы получить полезные понятия, терминологию и методы (например, трассировка GC , подсчет ссылок , слабые ссылки , циклические ссылки , умные указатели и т. д.). Они имеют значение даже для ручного управления памятью .
Управление памятью и ее распределение характерны для каждой программы, особенно в таких языках программирования, как C или C ++ (или Rust) с ручным управлением памятью, где соглашения имеют большое значение и характерны для каждой программы. Изучите исходный код существующих свободных программ серверов (например, Apache , Lighttpd , PostGreSQL , Xorg , Unison , Git , ...) и вы обнаружите, что у каждого из них есть свои соглашения об управлении памятью.