У меня есть сценарий, когда табличное представление загружает около 10000 строк, где в каждой строке находится изображение, размещенное в imageView. Изображения отображаются с помощью cellFactoy при прокрутке.
sismogramaColumn.setCellFactory((param) -> { // Renderiza la columna imagen
TableCell<TableListadoModel, ImageView> cell = new TableCell<TableListadoModel, ImageView>() {
protected void updateItem(ImageView item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
item = null;
} else {
if ( !((ImageViewSismograma)item).isRendered ) {
try {
((ImageViewSismograma)item).renderURL(); // <- AQUI CREA LA IMAGEN
// posibles Exceptions:
// FileNotFoundException, NoSuchFieldException
} catch (FileNotFoundException ex) {
renderImageSismogramaERROR(((ImageViewSismograma)item));
} catch (NoSuchFieldException ex) {
renderImageSismogramaERROR(((ImageViewSismograma)item));
} catch (IllegalArgumentException ex) {
renderImageSismogramaERROR(((ImageViewSismograma)item));
}
}
}
setItem(item);
setGraphic(item);
}
};
return cell ;
});
Функция рендеринга отвечает за создание экземпляра изображения и его вставку в imageView модели. .
public class ImageViewSismograma extends ImageView {
private String url;
private Image img;
private static int HIGH = 120;
private static int WIDTH = 320;
public boolean isRendered = false;
public ImageViewSismograma(String url) {
this.url = url;
this.setFitHeight(HIGH);
this.setFitWidth(WIDTH);
}
public void renderURL() throws
FileNotFoundException, NoSuchFieldException, IllegalArgumentException {
this.img = new Image(this.url);
this.setImage(img);
this.isRendered = true;
}
public void freeImage() {
this.img = null;
this.setImage(null);
}
}
Проблема в том, что при рендеринге изображений память переполняется, а когда я хочу сделать новый запрос, память, используемая этими предыдущими изображениями, не освобождается.
Попробуйте использовать функция, указывающая использованным объектам значение NULL, а затем вызывающая сборщик мусора Java (System.g c ()), но я все еще не могу освободить память, используемую загруженными изображениями.
public void freeModels() {
for (int i=0; i<models.size(); i++) {
models.get(i).getSismograma().freeImage();
models.get(i).setSismograma(null);
models.remove(i);
}
models.clear();
System.gc(); // Recolertor de basura
try
{
Thread.sleep(1500);
} catch (InterruptedException ex)
{
Systems.out.println(“Error en sleep”);
}
}