JavaFx imageView в накладных расходов памяти TableView - PullRequest
0 голосов
/ 15 января 2020

У меня есть сценарий, когда табличное представление загружает около 10000 строк, где в каждой строке находится изображение, размещенное в imageView. Изображения отображаются с помощью cellFactoy при прокрутке.

screenshot

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”);
    }
}

enter image description here

...