Что означает размер виртуальной памяти сверху?

124

Я бегу, topчтобы контролировать производительность моего сервера, и 2 из моих процессов Java показывают виртуальную память до 800 МБ-1 ГБ. Это плохо?

Что означает виртуальная память?

И, кстати, у меня есть своп 1 ГБ, и это показывает, 0% используется. Так что я в замешательстве.

Процесс Java = 1 сервер Tomcat + мой собственный сервер java-демона = Ubuntu 9.10 (karmic)

kapso
источник
См .: serverfault.com/questions/48582/…
Джулиано,

Ответы:

142

Виртуальная память даже не обязательно является памятью. Например, если процесс отображает в памяти большой файл, файл фактически сохраняется на диске, но он все еще занимает «адресное пространство» в процессе.

Адресное пространство (т. Е. Виртуальная память в списке процессов) ничего не стоит; это нереально. Что реально, так это столбец RSS (RES), который является резидентной памятью. Вот сколько вашей реальной памяти занимает процесс.

Но даже это не полный ответ. Если процесс вызывает fork (), он разделяется на две части, и обе они первоначально совместно используют все свои RSS. Таким образом, даже если бы RSS изначально был 1 ГБ, результатом после разветвления было бы два процесса, каждый с RSS 1 ГБ, но вы все равно использовали бы только 1 ГБ памяти.

Смущены еще? Вот что вам действительно нужно знать: используйте freeкоманду и проверьте результаты до и после запуска вашей программы (в +/- buffers/cacheстроке). Разница в том, сколько новой памяти использует ваша недавно запущенная программа.

apenwarr
источник
2
«Проверьте результаты до и после запуска вашей программы», либо используйте USS (уникальный набор размеров) в том виде, в каком он был возвращен smem.
Хьюберт Карио
Так есть ли инструмент, который дает реальный объем используемой памяти, инструменты, которые не являются сторонними.
CMCDragonkai
@CMCDragonkai Да, бесплатно.
Deviantfan
1
Если я запускаю процесс Java через java -Xmx16g RunLong, который зарезервирует 16 ГБ памяти для процесса Java, то в VIRTверхней части кажется, что 16 ГБ считается. В этом случае, каков тип этой 16-гигабайтной памяти, это отображенная память или ...?
Эрик Ван
1
@EricWang, эта память не отображается. Это просто запрос к ОС зарезервировать память, которая может понадобиться позже (возможно, никогда). (По крайней мере) в Linux это вызов mmap с флагами MAP_NORESERVE и PROT_NONE (см. Вызовы os :: pd_reserve_memory и anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); по умолчанию память фактически не выделяется - это делается только в тот момент, когда программе действительно требуется память для удовлетворения запросов на выделение объектов.
Юрай Мартинка
23

С верхней (1) страницы справочника:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Где RES означает резидентную память (используется физическая память).

На самом деле это не правильно (больше). Когда он говорит «swap», это также включает файлы, которые программа отображает в своем адресном пространстве, которые могут или не могут фактически потреблять реальную оперативную память. Эта память хранится в файле, но на самом деле это не подкачка.

VIRT также включает страницы, которые были выделены, но еще ни для чего не используются. Любая страница в этом состоянии сопоставляется с нулевой страницей ядра (блестящая концепция - вам следует поискать ее), поэтому она отображается в VIRT, но фактически не потребляет никакой памяти.

amphetamachine
источник
2
Что ж, интересно, так VIRT = SWAP + RES, почему мое использование SWAP равно нулю, а виртуальная память для двух процессов Java близка к 1 ГБ ??
Капсо
в основном топ-шоу .... Обмен: всего 1048568k, 0k использовано, 1048568k свободно, 505728k кэшировано
kapso
15
@ user42159 Этот ответ НЕПРАВИЛЬНЫЙ! В топе НЕТ "VIRT = SWAP + RES"! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT, Жаль, что я не могу понизить этот ответ.
дулеши
3
Этот ответ неверен. USED ​​= Res + Swap Size (из верхнего поля управления полями, доступ к которому осуществляется нажатием клавиши f, когда вверху. Также с верхней страницы руководства).
Джейсон С
15

Я нашел это объяснение Мугурела Суманариу очень ясным:

VIRTобозначает виртуальный размер процесса, который представляет собой сумму памяти, которую он фактически использует, память, которую он отобразил в себя (например, ОЗУ видеокарты для X-сервера), файлы на диске, которые были отображены в него (большинство особенно разделяемые библиотеки), и память, совместно используемая с другими процессами. VIRT показывает, сколько памяти программа может получить в настоящий момент.

RESобозначает резидентный размер, который является точным представлением того, сколько фактической физической памяти потребляет процесс. (Это также напрямую соответствует столбцу% MEM.) Это практически всегда будет меньше, чем размер VIRT, так как большинство программ зависят от библиотеки C.

SHRуказывает, какой размер VIRT на самом деле может быть разделен (память или библиотеки). В случае библиотек это не обязательно означает, что вся библиотека является резидентной. Например, если программа использует только несколько функций в библиотеке, вся библиотека отображается и будет учитываться в VIRT и SHR, но только части файла библиотеки, содержащие используемые функции, будут фактически загружены и подсчитаны. под RES.

Франк Дернонкур
источник
Я бы, пожалуй, только перефразировал: «VIRT представляет, сколько памяти программа может получить в настоящий момент». что-то вроде «VIRT представляет размер всего адресуемого пространства программы в настоящий момент». ОК, это все еще может использовать польский. Но дело в том, «сколько памяти» может создать впечатление, что мы обсуждаем ОЗУ, когда VIRT не имеет ничего общего с объемом ОЗУ. На самом деле, большие программы часто имеют размер VIRT, равный нескольким НЕСКОЛЬКИМ от общего объема ОЗУ системы, потому что этот VIRT почти полностью состоит из адресных областей с файловой поддержкой (AKA «диск, а не RAM»).
FERD
5

Столбец VIRT в выводе ps / top практически не имеет значения для измерения использования памяти. Не беспокойся об этом. Apache тяжелой нагрузки VIRT против RES памяти

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

leonbloy
источник
Спасибо, я забеспокоился и запутался, потому что, хотя использование свопа было 0%, столбец виртуальной памяти очень высок. И также у меня есть только 1,7 ГБ из общей 2,7 ГБ физической памяти, в то время как виртуальная память высока?
Капсо
2

Linux поддерживает виртуальную память, то есть использует диск в качестве расширения ОЗУ, так что эффективный объем используемой памяти соответственно увеличивается. Ядро запишет содержимое неиспользуемого в данный момент блока памяти на жесткий диск, чтобы память могла быть использована для других целей. Когда исходное содержимое снова необходимо, оно читается обратно в память. Все это сделано полностью прозрачным для пользователя; программы, работающие под Linux, видят только больший объем доступной памяти и не замечают, что их части время от времени находятся на диске. Конечно, чтение и запись на жесткий диск медленнее (в тысячу раз медленнее), чем при использовании реальной памяти, поэтому программы не работают так быстро. Часть жесткого диска, которая используется в качестве виртуальной памяти, называется пространством подкачки.

Linux может использовать либо обычный файл в файловой системе, либо отдельный раздел для пространства подкачки. Раздел подкачки быстрее, но легче изменить размер файла подкачки (нет необходимости перераспределять весь жесткий диск и, возможно, устанавливать все с нуля). Когда вы знаете, сколько места подкачки вам нужно, вам следует перейти к разделу подкачки, но если вы не уверены, вы можете сначала использовать файл подкачки, некоторое время использовать систему, чтобы вы могли почувствовать, сколько вы поменяете нужно, а затем сделать раздел подкачки, когда вы уверены в его размере.

Вы также должны знать, что Linux позволяет использовать несколько разделов подкачки и / или файлов подкачки одновременно. Это означает, что если вам иногда требуется необычный объем пространства подкачки, вы можете настроить дополнительный файл подкачки в такое время, вместо того, чтобы постоянно выделять весь объем.

Примечание по терминологии операционной системы: компьютерные науки обычно различают подкачку (запись всего процесса в пространство подкачки) и подкачку страниц (запись только частей фиксированного размера, обычно по несколько килобайт, за один раз). Пейджинг обычно более эффективен, и это то, что делает Linux, но традиционная терминология Linux в любом случае говорит об обмене.

Источник: http://www.faqs.org/docs/linux_admin/x1752.html

user42198
источник
1
Этот ответ распространяет заблуждение, что виртуальная память - это то же самое, что подкачка или подкачка. Использование диска в качестве расширения ОЗУ предшествует виртуальной памяти. И есть много систем (таких как большинство маршрутизаторов SoHo), которые имеют виртуальную память, но не используют диск в качестве расширения ОЗУ. (И это тоже не ответ на вопрос ОП, так как он не использует обмен).
Дэвид Шварц
2

VIRtualСтолбец top, относится к суперпространству (пространству сверхпотребления) процесса, которое процесс может фактически не занимать во время выполнения. Есть еще один столбец RESident, который ссылается на фактическую физическую память / пространство, выделенное процессом, во время выполнения.

Причину различий между ними можно понять по примеру: если процесс использует определенную библиотеку, то размер библиотеки также поможет virtual-size. однако, поскольку будет использоваться только часть библиотеки (то есть некоторые используемые методы), так что это поможет resident-size.

Обратитесь за дополнительной информацией

parasrish
источник
0

«VIRT» - это просто адресное пространство, RES - это «реальная» память, но «SHR» (= совместно используемая) величина «RES» - это часть RES, которая используется совместно с другими процессами. Поэтому для большинства процессов я считаю, что вычитание SHR из RES дает вам объем памяти, который действительно относится к этому конкретному процессу.

Максимум
источник