Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования