¿Carga imágenes grandes como miniaturas sin problemas de memoria en Java?

Estoy tratando de permitir que el usuario cargue imágenes de su disco duro y las presente visualmente en la GUI como una lista de miniaturas (JPanels con iconos agregados a una JList). Actualmente estoy usando ImageIO.read () para obtener una BufferedImage y usando getScaledInstance para cada imagen (escuché que no se suponía que usaras eso).

Funciona razonablemente bien con imágenes pequeñas, pero cargando más de cuatro fotografías (5000x3000 o algo así) y obtengo "java.lang.OutOfMemoryError: Java heap space". La referencia a BufferedImage a tamaño completo no se guarda, así que pensé que el recolector de basura la eliminaría y solo mantendría la imagen escalada (que no debería ocupar mucha memoria), pero no lo parece. Sigo getRuntime (). Gc () y System.gc () también, sin ningún efecto.

¿Alguna buena forma de cargar imágenes escaladas del archivo, sin encontrarse con errores de memoria? Obviamente, muchos softwares logran hacer esto, aunque quizás no en Java. Las bibliotecas externas están bien.

Código actual:

BufferedImage unscaledImage = ImageIO.read(imageFile);

int unscaledHeight = unscaledImage.getHeight();
int unscaledWidth = unscaledImage.getWidth();

int imageRatio = unscaledHeight/unscaledWidth;

if (imageRatio >= 1) {
    return new ImageIcon(unscaledImage.getScaledInstance(width,-1,Image.SCALE_FAST));
} else {
    return new ImageIcon(unscaledImage.getScaledInstance(-1,height,Image.SCALE_FAST));
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta