Я пишу приложение для удаленного рабочего стола. Поэтому я передаю изображения с одного компьютера на другой в виде массива байтов через сокет. После получения байтового массива я конвертирую его в изображение и рисую на панели. Код выглядит примерно так, как показано ниже
imageBytes = //read from socket.
InputStream in = new ByteArrayInputStream(imageBytes);
BufferedImage bufferedImage = ImageIO.read(in);
Image image = Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
Image scaledImage = image.getScaledInstance(rmdPanel.getWidth(),rmdPanel.getHeight() ,Image.SCALE_FAST);
Graphics graphics = rmdPanel.getGraphics();
graphics.drawImage(scaledImage, 0, 0, rmdPanel.getWidth(),rmdPanel.getHeight(),rmdPanel);
Я также храню imagebytes до следующего изображения (для сравнения). Теперь я получаю исключение Java из памяти в этом коде (при получении байтового массива). У меня размер кучи 128 мб-512 мб. Отправленные байты изображения не более 3 МБ.