Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    17

    Qual'è il modo corretto di caricare/scaricare un immagine (swing) in modo da evitare memory leak?

    Ciao ragazzi, per favore, ho bisogno di aiuto.
    Qual'è il sistema corretto di caricare/scaricare un immagine (in una JLabel ad esempio) in modo che quando ho finito con essa le risorse allocate vengano liberate?
    Non chiedetemi di postare del codice, il mio programma è molto lungo e complesso, ma non è questo il punto.
    Non mi interessa sapere cosa ho sbagliato io, poi quello me lo vedo con calma.
    Mi interessa sapere qual'è il modo corretto di farlo per evitare leak di memoria.
    Mi piacerebbe che qualcuno mi postasse un codice o una porzione di codice per spiegarmi qual'è la procedura corretta.
    In pratica: mettiamo che io ho aperto un JFrame, da questo apro un JDialog e al suo interno una JLabel contenente un immagine. Ho già sperimentato che il semplice dispose del JDialog non mi aiuta a liberare la memoria.
    Come devo fare per liberare quella memoria allocata?
    Grazie in anticipo per la disponibilità!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da LukeV Visualizza il messaggio
    Qual'è il sistema corretto di caricare/scaricare un immagine (in una JLabel ad esempio) in modo che quando ho finito con essa le risorse allocate vengano liberate?
    Dipende da come viene "caricato" l'oggetto Image contenuto nel ImageIcon.

    Spiego meglio: la classe ImageIcon si può creare in svariati modi (vedi costruttori). Se usi ad esempio i costruttori

    ImageIcon(String filename)
    ImageIcon(URL location)

    (e le altre varianti che aggiungono il String description)

    il caricamento materiale della immagine da file/url è delegato al java.awt.Toolkit di AWT, più precisamente al suo metodo getImage( ... )
    Il getImage (s)fortunatamente gestisce un meccanismo di "caching" delle immagini. Per più chiamate del getImage() con lo stesso medesimo filename/url, fornisce lo stesso oggetto Image. Quindi effettivamente tiene "in vita" gli oggetti Image anche se poi tu NON li usi più.

    La documentazione del Toolkit lo dice chiaramente: The underlying toolkit attempts to resolve multiple requests with the same filename to the same returned Image.

    Il modo per liberare le risorse della immagine c'è, è il flush() del Image. Attenzione, che questo NON impedisce il caching del Toolkit o toglie la immagine dalla cache del Toolkit.

    Se NON vuoi questo meccanismo di caching, devi caricare tu la immagine in altro modo: tramite il createImage() del Toolkit (che è simile al getImage ma SENZA il caching) oppure come BufferedImage con la API ImageIO.

    Nota che il ImageIcon(byte[] imageData) delega al createImage, non al getImage. Ma questa forma generalmente è poco/raramente utile.

    Se non viene usato quel (o qualunque altro) meccanismo di caching se hai un oggetto Image ed esso diventa non più raggiungibile, verrà certamente garbage-collected.
    Ultima modifica di andbin; 20-05-2019 a 21:10
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.