it-swarm.xyz

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

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

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

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

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

129
kapso

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

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

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

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

147
apenwarr

С верхней (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", это также включает файлы, которые программа отображает в свое адресное пространство, которое может или не может фактически потреблять реальное RAM пока. Эта память имеет файловую поддержку, но не на самом деле не поменяться.

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

24
amphetamachine

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

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

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

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

18
Franck Dernoncourt

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

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

5
leonbloy

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

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

См. Подробнее

2
parasrish

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

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

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

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

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

1
user42198

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

0
Max