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

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


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

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

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

Alexander Pavlov 13.02.2023 22:57

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

RamPrakash 13.02.2023 23:00
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
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

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