Использование непрямого буфера Java

Я много искал и проверил несколько ответов ... ни один из них мне не ясен.


В Java есть ByteBuffer. Имеет 2 вкуса. 1 прямой, а другой непрямой. Прямой буфер хорош для ввода-вывода.

Зачем нужен непрямой байтовый буфер, когда у нас есть byte[]? Когда это использовать?

Общий интерфейс, поэтому вы можете использовать byte[] всякий раз, когда это необходимо, без if_elsing

Alexander Pavlov 13.02.2023 22:57

В этом есть смысл. Это единственный вариант использования?

RamPrakash 13.02.2023 23:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

непрямые ByteBuffers хранятся в куче и поддерживаются базовым массивом байтов. Обычно они используются, когда вам нужен буфер, доступный для чтения и записи приложением Java, но не требующий такого же уровня производительности, как прямой ByteBuffer.

Так почему бы не всегда использовать прямой ByteBuffer?

  1. Сборка мусора: непрямые байтовые буферы подлежат сборке мусора, которая может автоматически освобождать память, когда она больше не нужна. С прямыми ByteBuffers вы должны вручную освобождать память.
  2. Параллелизм: Direct ByteBuffers не являются потокобезопасными и требуют явной синхронизации для безопасного доступа к ним нескольких потоков, что может усложнить ваш код и увеличить накладные расходы.
  3. Сложность: прямые байтовые буферы часто требуют ручной обработки и могут включать работу с собственным кодом, что может сделать их более сложными и трудными для работы, чем непрямые байтовые буферы.
  4. Повышенная задержка. Прямые байтовые буферы могут иметь повышенную задержку по сравнению с непрямыми байтовыми буферами, поскольку память выделяется за пределами кучи Java и должна передаваться в собственную кучу и из нее.
  5. Изменение производительности. Производительность с прямыми байтовыми буферами может варьироваться в зависимости от базовой системы и оборудования, что затрудняет прогнозирование и гарантирование производительности.

Я знаю, что непрямой буфер хранится в куче и может использовать базовый байт []. Мой вопрос очень специфичен для того, в каком сценарии это можно было бы сделать? кто бы сказал no за преимущества производительности?

RamPrakash 13.02.2023 22:59

Я отредактировал комментарий, надеюсь, теперь стало понятнее, в чем разница между ними.

postFix 13.02.2023 23:14

В приведенном выше ответе много неверной информации. 1: DirectByteBuffer — это сборщик мусора, как и версия onheap. 2: байтовые буферы onheap также не являются потокобезопасными. 3: сложность с прямыми байтовыми буферами — это нативный код, который намного проще по сравнению с кучей один раз, потому что вы можете просто получить указатель на базовую память и передать его.

pveentjer 15.02.2023 03:43

4: байтовые буферы onheap также могут увеличить задержку; например при работе с сокетами их сначала нужно скопировать в прямой байтовый буфер, прежде чем их можно будет передать в сокет. При непосредственном использовании directbytebuffer этот шаг копирования пропускается.

pveentjer 15.02.2023 03:44

Другие вопросы по теме