Я почти уверен, что преднамеренно , что байтовые буферы имеют фиксированную емкость.Я призываю вас не пытаться обойти это, как если бы это был недостаток дизайна.Примите это и примите это как целенаправленное ограничение.
Если вы позволите ByteBuffers расти, то у compact()
больше не будет предсказуемого максимального времени выполнения.Чем больше размер вашего буфера, тем больше времени потребуется для его сжатия.Я столкнулся именно с этой проблемой в моей библиотеке сокетов NIO.У меня выросли внутренние буферы для размещения больших инъекций данных, и следствием этого стало замедление производительности пропорционально тому, сколько данных было буферизовано.
Например, кто-то может попытаться отправить 100 МБ данных за один раз, поэтому ясохранит эти данные в одном байтовом буфере размером 100 МБ.Код обработки может обрабатывать только около 32 КБ за раз, поэтому он извлекает из буфера 32 КБ данных, а затем сжимает их.Затем еще 32 КБ и еще одно уплотнение.Он будет продолжать чтение и сжатие до тех пор, пока не будет опустошен буфер.
Каждое сжатие является операцией O (n), и я выполнял O (n) многих из них, что привело к общему времени выполнения O (n *).1010 * 2 ).Действительно плохие новости.Я заметил проблему, когда буферы становились настолько большими, что запросы ввода-вывода начинались по тайм-ауту, потому что поток ввода-вывода тратил все свое время на сжатие ByteBuffers.
Решение: Если вы хотите динамическийбуферы, создайте Queue<ByteBuffer>
.Очередь может увеличиваться и вмещать неограниченное количество байтовых буферов, в то время как каждый буфер остается фиксированного размера.Это позволит вашему приложению масштабироваться правильно, не сталкиваясь с проблемой O (n 2 ).