Originariamente inviato da sysoftware
Come posso fare che ad ogni cambio di immagine elimino la vecchia immagine dalla memoria?

codice:
img = new ImageIcon(getClass().getClassLoader().getResource(pkgLezione
                    + "/" + "lezione" + numLezione + "_p" + index + ".jpg"));
Il punto sta tutto lì, nel come viene caricata la immagine.

ImageIcon è una classe che incapsula semplicemente un java.awt.Image e permette di disegnare questa immagine nei componenti compatibili perché implementa Icon.

Nel codice sopra però è stato usato il costruttore ImageIcon(URL location). Il caricamento vero e proprio della immagine però è demandato al "toolkit" (java.awt.Toolkit), in particolare al suo metodo getImage(URL)

La questione fondamentale: il getImage di Toolkit sfrutta un sistema di "caching" interno delle immagini. A parità di filename o URL (a seconda della versione del metodo) restituisce lo stesso identico oggetto Image. Ed è chiaro che per fare ciò ha bisogno di una mappatura in memoria e di tenere referenziate le immagini!

Soluzione: evitare di usare (anche indirettamente) il getImage. E usare invece il createImage di Toolkit.

1) Si ottiene il Toolkit (è una unica istanza, c'è il metodo "factory" in Toolkit stesso)
2) Si usa il createImage(URL url) (e passi la risorsa esattamente come hai già fatto)
3) Si istanzia il ImageIcon usando il suo costruttore ImageIcon(Image image)

Tutto qui.