Зачем нужны direct-буферы (ByteBuffer.allocateDirect) и в чём их минусы?
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-памяти?
- Как диагностировать утечку вне кучи?
Разбор темы
- NIO: каналы, буферы и неблокирующий ввод-вывод
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.