У меня есть функция Java, которая загружает несколько изображений с хранилища Blob, изменяет их размеры и возвращает их в качестве байтового массива. Эта функция выполняется в параллельном потоке: < /p>
Mat image = imageConversionService.getMatFromBinaryData2(data.getSecond());
Mat resizedImage = resizeMat(image, textureResolutionType);
byte[] imageBytes = imageConversionService.matToBytes(resizedImage);
image.release();
resizedImage.release();
return imageBytes
< /code>
Я использую эту функцию для преобразования моих двоичных данных в Mat: < /p>
public Mat getMatFromBinaryData2(BinaryData binaryData) {
MatOfByte matOfByte = new MatOfByte(binaryData.toBytes());
Mat image = Imgcodecs.imdecode(matOfByte, Imgcodecs.IMREAD_UNCHANGED);
matOfByte.release();
return image;
}
< /code>
и эта функция для преобразования мата в массив байтов: < /p>
public byte[] matToBytes(Mat mat) {
MatOfByte mob = new MatOfByte();
Imgcodecs.imencode(".png", mat, mob);
byte[] byteArray = mob.toArray();
mob.release();
return byteArray;
}
< /code>
Я заметил, что мое потребление памяти непрерывно увеличивается с количеством выполнения. Когда я развертываю свое приложение в Azure, оно вылетает после нескольких прогонов, потому что память заполнена, и если я запускаю приложение локально в докере, я также могу отслеживать увеличение памяти. Функции.
Я попробовал реализацию Pure Java с Graphics2D, но она намного медленнее, и BufferedImage не поддерживает 16 -битную глубину цвета.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... emory-leak