Що означає розмір віртуальної пам'яті вгорі?


124

Я бігаю, topщоб відстежувати продуктивність мого сервера, і 2 моїх java-процесів показують віртуальну пам'ять об'ємом до 800 МБ-1 Гб. Це погано?

Що означає віртуальна пам'ять?

І о btw, у мене є обмін на 1 ГБ, і він показує 0%, що використовується. Тож я розгублений.

Java-процес = 1 сервер Tomcat + власний сервер java daemon = Ubuntu 9.10 (кармічний)


Відповіді:


142

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

Адресний простір (тобто віртуальна пам'ять у списку процесів) нічого не коштує; це не реально. Що реально, це стовпчик RSS (RES), який є пам'яттю резидента. Ось скільки вашої фактичної пам’яті займає процес.

Але навіть це не вся відповідь. Якщо процес викликає fork (), він розбивається на дві частини, і обидві вони спочатку діляться всім своїм RSS. Тож навіть якщо спочатку RSS був 1 Гб, результатом після форкінгу буде два процеси, кожен з яких має RSS 1 Гб, але ви все одно використовуєте лише 1 ГБ пам'яті.

Плутати ще? Ось що вам потрібно насправді знати: скористайтеся freeкомандою та перевіряйте результати до та після запуску програми (у +/- buffers/cacheрядку). Ця різниця полягає в тому, скільки нової пам’яті використовувала ваша нещодавно запущена програма.


2
"Перевірка результатів до і після запуску програми", або ж використати USS (Унікальний розмір набору), як повернуто smem.
Хуберт Каріо

Отже, є інструмент, який дає справжній об'єм пам'яті, що використовується, інструменти, які не є сторонніми.
CMCDragonkai

@CMCDragonkai Так, безкоштовно.
Девіантфан

1
Якщо я запускаю java-процес через java -Xmx16g RunLong, який би резервував 16Gb пам'яті для процесу java, то VIRTвгорі, здається, 16Gb зараховується. У цьому випадку, який тип цієї пам’яті 16Gb, це карта, пам'ять чи ..?
Ерік Ван

1
@EricWang, ця пам'ять не відображається. Це просто запит до ОС, щоб зберегти пам'ять, яка може знадобитися пізніше (можливо, ніколи). (Принаймні) в Linux, це виклик mmap із прапорами MAP_NORESERVE та PROT_NONE (див. Os :: pd_reserve_memory call 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, але насправді не споживає пам'яті.


2
добре, що цікаво, так це VIRT = SWAP + RES, як у мене використання SWAP дорівнює нулю, тоді як віртуальна пам'ять для двох Java-процесів близька до 1 ГБ ??
kapso

в основному Топ-шоу .... Зміна: всього 1048568k, використано 0k, безкоштовно 1048568k, кешовано
505728k

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 + розмір заміни (з верхнього управління полями, доступ до якого здійснюється натисканням клавіші f, коли зверху. Також з верхньої сторінки сторінки).
Jason S

14

Я вважаю це пояснення від Mugurel Sumanariu дуже зрозумілим:

VIRTозначає віртуальний розмір процесу, який є сумою пам’яті, яку він фактично використовує, пам'ять, яку він відобразив у себе (наприклад, оперативна пам’ять відеокарти для сервера X), файли на диску, які були відображені в неї (більшість зокрема спільні бібліотеки) та пам'ять, що ділиться з іншими процесами. VIRT представляє, скільки пам’яті програма може отримати доступ в даний момент.

RESозначає розмір резидента, який є точним поданням про те, скільки фактичної фізичної пам'яті споживає процес. (Це також безпосередньо відповідає стовпцю% MEM.) Це практично завжди буде меншим за розмір VIRT, оскільки більшість програм залежить від бібліотеки С.

SHRвказує, яка кількість розміру VIRT насправді доступна для спільного використання (пам'ять або бібліотеки). Що стосується бібліотек, це не обов'язково означає, що вся бібліотека є резидентом. Наприклад, якщо програма використовує лише декілька функцій у бібліотеці, вся бібліотека відображається на карті та буде рахуватися у VIRT та SHR, але тільки ті частини бібліотечного файлу, що містять використовувані функції, фактично завантажуються та підраховуються за ВДЕ.


Можливо, я б лише переказав слово "VIRT являє собою кількість пам'яті, яку програма може отримати в даний момент". на щось на кшталт "VIRT представляє розмір всього адресного простору програми на даний момент". Добре, що все-таки можна використовувати польський. Але справа в тому, "скільки пам'яті" все ще може створити враження, що ми обговорюємо оперативну пам'ять, коли VIRT не має нічого спільного з простором оперативної пам'яті. Насправді великі програми часто матимуть розмір VIRT, який становить декілька МНОГО загальних розмірів системної оперативної пам’яті - тому що VIRT майже повністю підтримується файлами адресних областей (AKA «диск не ОЗУ»).
FeRD

5

Стовпець VIRT у виводі ps / top майже не має значення для вимірювання використання пам'яті. Не хвилюйся з цього приводу. Apache велике навантаження VIRT проти запам'ятовуючої пам'яті

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


Дякую, я занепокоївся і розгубився, тому що при використанні свопу 0%, стовпець віртуальної пам'яті дуже високий. А також у мене всього 1,7 Гб загальної використаної фізичної пам'яті 2,7 ГБ, а віртуальна пам'ять висока?
kapso

2

Linux підтримує віртуальну пам’ять, тобто використовує диск як розширення оперативної пам’яті, щоб відповідно збільшувався ефективний розмір корисної пам’яті. Ядро запише вміст не використаного на сьогодні блоку пам'яті на жорсткий диск, щоб пам'ять могла бути використана з іншою метою. Коли оригінальний вміст знову потрібен, вони зачитуються назад в пам'ять. Це все зроблено повністю прозоро для користувача; програми, що працюють під Linux, бачать лише більший об’єм пам’яті, і час від часу не помічають, що їх частина знаходиться на диску. Звичайно, читання та запис на жорсткий диск відбувається повільніше (на замовлення в тисячу разів повільніше), ніж використання реальної пам'яті, тому програми не працюють так швидко. Частина жорсткого диска, яка використовується як віртуальна пам'ять, називається простором swap.

Linux може використовувати або звичайний файл у файловій системі, або окремий розділ для swap простору. Розміняти розділ своєю швидкістю, але простіше змінити розмір файлу swap (не потрібно перерозподіляти весь жорсткий диск і, можливо, встановити все з нуля). Коли ви знаєте, скільки місця для заміни вам потрібно, вам слід перейти до розділу swap, але якщо ви не впевнені, ви можете спочатку скористатися файлом swap, скористайтеся системою деякий час, щоб ви могли відчути, скільки вам підміняти. потрібно, а потім зробіть своп-розділ, коли ви впевнені в його розмірах.

Вам також слід знати, що Linux дозволяє одночасно використовувати декілька підкачаних розділів та / або обмінювати файли. Це означає, що якщо вам лише час від часу потрібна незвична кількість місця для заміни, ви можете створити додатковий файл swap в такі часи, замість того, щоб весь час виділяти всю суму.

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

Джерело: http://www.faqs.org/docs/linux_admin/x1752.html


1
Ця відповідь поширює помилкове уявлення про те, що віртуальна пам'ять є такою ж, як обмін або пейджингом. Використання диска як розширення оперативної пам'яті передує віртуальній пам'яті. І є безліч систем (наприклад, більшість маршрутизаторів SoHo), які мають віртуальну пам'ять, але не використовують диск як розширення оперативної пам'яті. (І це також не є відповіддю на запитання ОП, оскільки він не використовує жодного свопу.)
Девід Шварц

2

VIRtualстовпець вгорі посилається на надпростір (суперспоживний простір) процесу, який процес може фактично не зайняти під час виконання. Існує ще один стовпець RESident, в якому йдеться про фактичну фізичну пам'ять / простір, виділений процесом, під час виконання.

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

Зверніться до додаткової інформації


0

"VIRT" просто адресний простір, RES - це "реальна" пам'ять, але "SHR" (= спільна) кількість "RES" - це частина ВДЕ, яка ділиться з іншими процесами. Отже, для більшості процесів я вважаю, що віднімання SHR з ВДЕ дає вам обсяг пам’яті, який справді можна віднести до цього конкретного процесу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.