Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    10

    Applicazzione che non rilascia memoria

    Salve a tutti,il mio problema è questo:

    Ho un'applicazione che ha una finestra con un solo pulsante (scaricabile da qui,con tanto di codice --> http://www.mediafire.com/?hdwum9v3cb0j3c5) questa applicazione premendo sul pulsante va a caricare un file di musica un tot di volte (assegnandolo ad un oggetto apposito),ho scelto di caricare musica così si notava bene l'aumento di RAM.
    Il problema è proprio questo,nonostante io stia caricando queste musiche senza assegnarle ad una variabile,e quindi la memoria che viene da loro occupata dovrebbe essere liberata,queste continuano ad occupare memoria,quindi se andiamo a premere il pulsante molte volte la memoria continua a salire vertiginosamente senza mai liberarla.
    Potreste dirmi come risolvere questo problema? (Ovviamente devo risolverlo in un'altra applicazione,ma dato che anche qui da lo stesso problema in due righe di codice capirete meglio!)
    Grazie =)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Non ho scaricato il programma ed il codice, però potresti postare la parte di codice relativa al caricamento. Se, ad esempio, per il caricamento fai uso di una libreria esterna o di una classe del core standard, che semplicemente carica il file in memoria ma non lo rilascia se non su richiesta, sei tu a dover fare questa richiesta. Poco importa che tu poi il risultato dell'elaborazione non lo salvi da nessuna parte: un oggetto diventa eliggibile per il GC quando non c'è più nessun riferimento "attivo" ad esso... se la libreria mantiene un riferimento deve esserci qualcosa per poterlo deallocare.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326
    Ho scaricato il codice ed è effettivamente come dicevo: carichi 100 volte il file audio ma non chiudi mai il Clip...

    Quando l'elaborazione è finita dovresti effettuare un clip.close() (metodo ereditato dall'interfaccia Line), che recita:

    Closes the line, indicating that any system resources in use by the line can be released.
    E potrebbe essere utile anche chiudere l'AudioInputStream, se già non lo fa il Clip.close().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    10
    Allora,vi ringrazio per le vostre risposte,e effettivamente avete ragione,non chiudevo lo stream.
    Allora ho modificato l'applicazione in modo che inserisse gli oggetti in un arraylist con un pulsante,mentre con un altro gli chiudesse tutti e creasse un nuovo arraylist,
    Ora,dopo aver premuto un po di volte il pulsante musica,sono passato da 20mb di memoria a 200.
    Mi aspetterei con il pulsante chiudi di tornare sui 20,invece al massimo arrivo sui 100-130.
    Vi ripasso l'applicazione con il pulsante chiudi:http://www.mediafire.com/?2v24rhah25zc5ze

    In qualsiasi caso la musica la carico in questa maniera:
    codice:
        
    public Musica(String percorso) throws UnsupportedAudioFileException, IOException, LineUnavailableException{    
         stream = AudioSystem.getAudioInputStream(new File(percorso));   
          AudioFormat format = stream.getFormat();    
         if (format.getEncoding() !=   AudioFormat.Encoding.PCM_SIGNED) {    
             stream=AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,stream);      
         }       
         DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat());  
         clip = (Clip) AudioSystem.getLine(info);          
         clip.open(stream);     }

  5. #5
    Prima di tutto ti consiglio di dare magari un occhiata a come effettivamente funziona il Garbage Collector.
    Creare un nuovo arraylist nn vuoldire che il "gc" proprio in quel momento libererà la memoria allocata dalla vecchia lista. Sta sicuro (ho testato il tuo programma) la memoria viene effettivamente liberata appena il "gc" parte. Cmq se vuoi testarlo ti basta aggiungere
    codice:
    System.gc();
    alla fine del actionPerformed.
    Attenzione invocando quel metodo non è detto che il gc parte veramente quindi dovrai fare qualche test di seguito in modo che effettivamente parta.
    Un'altro modo per testarlo è utilizzare JVisulVm che permette anche l'invocazione del GC.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    10
    Avevo provato inserendo System.cg() e non mi pare liberasse,comunque riproverò u.u
    Mi vergogno di aver scritto applicazione con due Z nel titolo,perdonatemi y.y

    Allora,ho fatto qualche test,e anche aspettando un po (un decina di secondi,piu volte) non ha liberato la memoria,dove trovo questo programma della java virtual machine che dicevi te?

    Ok,trovata e testato,anche utilizzando questa applicazione,e lanciando da essa il GC,l'applicazione non ritorna allo stato iniziale di memoria,tutt'al più ne libera un po di più (scusate la ripetizione u.u),diciamo che utilizzando il GC forzato (almeno pare) dell jvisualvm dai 100-130 si passa a 80-110 per dire.
    Quindi alla fin fine non libera tutto,nemmeno aspettando =/,(quanto meno qualcosa rilascia,spero di trovare soluzioni migliori,ma questa è gia buona XD).
    Se avete altri consigli sarei veramente lieto u.u

  7. #7
    se stai usando un jdk lo trovi nella cartella bin l'eseguibile si chiama "jvisualvm".
    Edit
    Ti allego lo screen di jvisualvm che fa vedere esattamente quello che succede.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    10
    Sisi alla fine son riuscito a trovarlo ad a farlo partire,però anche con il GC forzato non va a liberare la memoria,tornando sui 30 MB,tutt'al piu ne libera un po (tra l'altro ne libera un po per volta,tipo se vado a premerlo svariate volte prima ne libera 10 MB poi altri 10 e cosi via)
    Non capisco il problema di tutto ciò ç_ç

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 © 2025 vBulletin Solutions, Inc. All rights reserved.