Получить доступ

Зачем нужны direct-буферы (ByteBuffer.allocateDirect) и в чём их минусы?

SeniorВвод-вывод и NIO
Коротко

Direct-буфер живёт вне кучи и передаётся ядру без промежуточного копирования (heap-буфер JVM копирует во временный нативный, потому что GC может переместить объект). Минусы: дорогое создание, освобождение недетерминировано (через GC), память не видна в -Xmx.

  • Создавать редко и переиспользовать — пулы буферов (Netty)
  • Лимит: -XX:MaxDirectMemorySize
  • OutOfMemoryError: Direct buffer memory — частая проблема в контейнерах

А ещё Memory-mapped файлы (MappedByteBuffer) — тоже вне кучи

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Обычный heap-буфер живёт в куче, которую сборщик вправе перемещать, поэтому при системном вызове JVM вынуждена копировать данные во временный нативный буфер. Direct-буфер размещён вне кучи и передаётся ядру напрямую — на больших объёмах и частых операциях это заметный выигрыш. Минусы существенны: выделение и освобождение дороже, память не учитывается в размере кучи и ограничена отдельным параметром MaxDirectMemorySize, а фактическое освобождение наступает только после сборки объекта-обёртки. Отсюда практика — выделять такие буферы один раз и переиспользовать через пул, а не создавать на каждую операцию. Утечка direct-памяти выглядит особенно неприятно: куча в норме, а процесс растёт.

Что хотят услышать

  • Зачем нужны.
  • Минусы и как с ними жить.

Частые ошибки

  • Создавать direct-буфер на каждый запрос.
  • Искать причину роста памяти только в куче, забыв про off-heap.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Память вне кучи позволяет ядру читать и писать без промежуточного копирования, но выделение дороже, а освобождение зависит от сборщика
  • ✗Они всегда быстрее обычных буферов и не имеют недостатков
  • ✗Они хранят данные в куче, но в отдельном поколении
  • ✗Они нужны только для работы с файлами, но не с сокетами

Что спросят дальше

  • Каким параметром ограничивается объём direct-памяти?
  • Как диагностировать утечку вне кучи?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем