Gymterview
middle

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

Виртуальная память — это механизм управления памятью, при котором каждый процесс работает со своим собственным виртуальным адресным пространством, которое отображается на физическую оперативную память (и диск) средствами ОС и аппаратного обеспечения (MMU).

Аналогия: каждому жильцу многоквартирного дома кажется, что у него «квартира номер 1 на первом этаже». На самом деле управляющая компания (ОС) расселяет всех по разным физическим квартирам, а жильцы об этом не знают. Если физических квартир не хватает — часть вещей временно вывозят на склад (swap).

Зачем нужна виртуальная память

  • Изоляция процессов — каждый процесс видит только свою память и не может повредить память другого процесса.
  • Абстракция — процесс думает, что у него есть непрерывное адресное пространство, хотя в физической памяти данные могут быть разбросаны.
  • Расширение памяти — суммарный объём виртуальной памяти всех процессов может превышать объём физической RAM за счёт использования диска (swap).

Страничная организация (Paging)

  • Виртуальное адресное пространство разбивается на страницы (pages) фиксированного размера (обычно 4 КБ).
  • Физическая память разбивается на фреймы (frames) того же размера.
  • Таблица страниц (page table) — структура данных, поддерживаемая ОС, которая хранит соответствие: виртуальная страница -> физический фрейм.
  • Каждый процесс имеет собственную таблицу страниц.

Трансляция адреса

  1. Процесс обращается к виртуальному адресу.
  2. MMU (Memory Management Unit) — аппаратный блок в процессоре — разделяет адрес на номер страницы и смещение внутри страницы.
  3. По номеру страницы ищется физический фрейм в таблице страниц.
  4. Физический адрес = адрес фрейма + смещение.

TLB (Translation Lookaside Buffer)

  • Специальный кэш в процессоре для хранения недавних трансляций «виртуальная страница -> физический фрейм».
  • Обращение к TLB — 1-2 такта. Промах по TLB (TLB miss) требует обхода таблицы страниц — десятки тактов.
  • TLB обычно содержит 64-1024 записи.
  • При переключении между процессами TLB сбрасывается, что делает переключение контекста между процессами дорогим.

Подкачка (Swap)

  • Когда физической памяти не хватает, ОС выгружает редко используемые страницы на диск (в swap-файл или swap-раздел).
  • Когда процесс обращается к выгруженной странице, возникает page fault (страничная ошибка): ОС приостанавливает процесс, загружает страницу с диска обратно в RAM, обновляет таблицу страниц и возобновляет процесс.
  • Page fault — очень дорогая операция (миллисекунды), поэтому частое использование swap резко снижает производительность.

Значение для Java-разработчика

  • JVM-процесс работает в виртуальном адресном пространстве. Heap, стеки потоков, metaspace — всё это виртуальные адреса.
  • Если JVM выделяет больше памяти, чем есть физической RAM, ОС начнёт swap, и GC-паузы могут вырасти с миллисекунд до секунд.
  • Рекомендация для production: суммарная память всех JVM-процессов + ОС не должна превышать физическую RAM. Многие команды явно отключают swap на серверах (swapoff -a) или настраивают vm.swappiness=0.
  • Huge Pages (2 МБ или 1 ГБ вместо 4 КБ) снижают нагрузку на TLB и могут улучшить производительность JVM с большим heap. Включаются через -XX:+UseLargePages.

Вывод

Виртуальная память обеспечивает изоляцию процессов, абстракцию адресного пространства и возможность использовать больше памяти, чем есть физической RAM. Механизм основан на страничной организации и аппаратной трансляции адресов через MMU и TLB. Для Java-приложений критически важно не допускать ухода в swap.

На собеседовании: middle-вопрос. Ключевые моменты: что такое page table и TLB, почему переключение контекста между процессами дорого (сброс TLB), и почему swap — враг JVM-приложений в production. Если расскажете про Huge Pages — это бонус.