Если вы читаете контракт,
InputStream.read():int
возвращает -1, когда заканчивается поток.
Таким образом, если поток не содержит символ 0xff (например, еслипоток заканчивается до получения 0xff), этот код будет просто добавлять последний полученный байт (например, -1) к этому массиву навсегда!
Исправить таким образом:
while (bytes.isEmpty() || bytes.last() != vplEndByte || bytes.last != -1) {
// --проблемы
Несмотря на то, что вы должны обязательно ставить верхние границы этого кода, чтобы избежать OOM, конкретная проблема, с которой вы столкнулись, связана с
def bytes = [] //[] is shorthand for "new ArrayList()"
. Это создает ArrayList, массив с поддержкойструктура данных, которая начинается с выделения массива и увеличивается путем удвоения его размера при каждом достижении предыдущей емкости.Я считаю, что размер по умолчанию составляет всего 10 элементов.
Таким образом, вы неявно создаете здесь огромное количество массивов, на что жалуется беспорядок трассировки стека.В высокопроизводительном приложении с сообщениями небольшого размера от нескольких K до M, скорее всего, вы выделяете новые массивы быстрее, чем может выдержать GC.
Вы должны рассмотреть возможность создания этого массива с разумным начальным размером дляуменьшить неявную реализацию объекта и ввести разумные максимальные границы.Вы также можете переключить эту коллекцию в связанный список, но у вас может снизиться производительность.