Я смотрю на память, используемую моим приложением, чтобы убедиться, что я не выделяю слишком много, и я не совсем понимаю, что показывает мне Gnome Resource Monitor. Я использовал следующие фрагменты кода для выделения памяти в двух отдельных приложениях, которые в остальном идентичны; они не содержат ничего, кроме этого кода и вызова функции scanf (), чтобы приостановить выполнение, пока я хватаю использование памяти:
malloc(1024 * 1024 * 100);
а также
char* p = new char[1204*1024*100];
На следующем рисунке показано использование памяти моим приложением до и после каждой из этих строк:
Теперь я много читал (но явно недостаточно) об использовании памяти (в том числе этот ТАК вопрос), и у меня возникли проблемы с разграничением записываемой памяти и виртуальной памяти. Согласно связанному вопросу,
«Записываемая память — это количество адресного пространства, которое имеет ваш процесс
выделены с правами записи «
а также
«Виртуальная память — это адресное пространство, которое есть у вашего приложения
выделяется»
1) Если я сам выделил память, наверняка у нее есть права на запись?
2) Связанный вопрос также заявляет (относительно malloc)
«… который на самом деле не выделит никакой памяти. (См. разглагольствование в конце
страницы malloc (3) для деталей.) «
Я не вижу никакой «напыщенной речи», и мои изображения показывают виртуальную память имеет выросла! Может кто-нибудь объяснить это, пожалуйста?
3) Если у меня есть чисто следующий код:
char* p = new char[100];
…Монитор ресурсов показывает, что объем памяти и доступная для записи память увеличились на 8 КБ — так же, как когда я выделял один полный мегабайт! — с увеличением виртуальной памяти на 0,1. Что здесь происходит?
4) На какой столбец я должен смотреть в мониторе ресурсов, чтобы увидеть, сколько памяти использует мое приложение?
Заранее большое спасибо за участие, и извините, если не поняли или пропустили что-либо, что могло бы заставить меня найти ответы самостоятельно.
Классы памяти, о которых сообщает монитор ресурсов Gnome (и, по сути, подавляющее большинство инструментов отчетности о ресурсах), — это не просто отдельные классы памяти — они перекрываются, поскольку они сообщают о различных характеристиках памяти. Некоторые из этих различных характеристик включают в себя:
xterm
запуск экземпляров не означает, что код для xterm
необходимо загружать 37 раз в память — все процессы могут совместно использовать одну копию кодаИз-за этих и нескольких других факторов (общая память IPC, файлы с отображением в памяти, физические устройства, у которых есть области памяти, отображенные в аппаратном обеспечении и т. Д.), Определение фактической памяти, используемой любым отдельным процессом или даже всей системой, может быть сложным.
Более точный способ понять в Linux использование памяти работающей процесс это использовать Proc (5) файловая система.
Итак, если ваш процесс pid 1234, попробуйте
cat /proc/1234/maps
Обратите внимание, что процессы имеют свои адресное пространство в виртуальная память. Это адресное пространство может быть изменено ММАП (2) и другие Системные вызовы (2). По нескольким причинам эффективности таНос (3) а также free
избегайте слишком большого количества этих системных вызовов и предпочитайте повторно использовать их ранее free
Зоны памяти. Итак, когда ваша программа free
-ing (или, в C ++, delete
-ing) некоторый фрагмент памяти, который часто помечается как повторно используемый, но не высвобождается обратно в ядро (например, munmap
). Точно так же, если вы malloc
всего 100 байт, ваш libc
разрешено, например, запросить целый мегабайт используя mmap
(в следующий раз вы звоните malloc
например, 200 байтов, он будет использовать часть этого magabyte)
Смотрите также http://linuxatemyram.com/ а также Расширенное программирование в Linux (а также этот вопрос о переполнении памяти)