Autore Topic: MaxHeap e FreeHeap per bitmap  (Letto 790 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
MaxHeap e FreeHeap per bitmap
« il: 26 Gennaio 2012, 13:04:53 CET »
0
mi sto scontrando con un problema nella mia app...la mia app scatta una sequenza di foto che puo' arrivare a fare anche 50 scatti in un'ora.
il problema è che dopo un certo numero di foto scattate, non le salva piu perchè FreeHeap è troppo basso..come dice nel logcat:
Codice: [Seleziona]
01-25 22:22:27.611: E/dalvikvm-heap(2740): 10077696-byte external allocation too large for this process.
01-25 22:22:27.611: E/GraphicsJNI(2740): VM won't let us allocate 10077696 bytes
01-25 22:22:27.611: W/GraphicsJNI(2740): MaxHeap is 30535696, but FreeHeap is 7987232
01-25 22:22:27.611: W/GraphicsJNI(2740): MaxHeap is 30535696, but FreeHeap is 7987232
01-25 22:22:27.611: W/GraphicsJNI(2740): MaxHeap is 30535696, but FreeHeap is 7987232,so we don't throw exception!!!
01-25 22:22:27.611: D/skia(2740): --- decoder->decode returned false
01-25 22:22:27.627: I/global(2740): Default buffer size used in BufferedOutputStream constructor. It would be better to be explicit if an 8k buffer is required.
01-25 22:22:27.627: E/(2740): errore exception
il codice che uso è questo:
Codice (Java): [Seleziona]
  try {
                 myImage1 = BitmapFactory.decodeByteArray(_data,0,_data.length);

                       fileOutputStream = new FileOutputStream(img);
                                                       
                        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);

                        myImage1.compress(CompressFormat.JPEG, 100, bos);
                       
                        bos.flush();
                        bos.close();

                        fileOutputStream.flush();
                        fileOutputStream.close();

                            myImage1.recycle();// provo a svuotare la memoria dopo averla salvata
                           
                           
         } catch (FileNotFoundException e) {
                    Log.e("demo", e.toString());
                    System.gc();

            } catch (IOException e) {
                Log.e(TAG, "errore ioexception");
                                e.printStackTrace();
                                System.gc();

                        }
            catch( Exception e ) {
                Log.e(TAG, "errore exception");
              System.gc();
            }
avete idea di come liberare la memoria Heap dopo aver completato il salvataggio?
altrimenti dopo un certo numero di foto salvate, l'applicazione diventa inutilizzabile :(
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:MaxHeap e FreeHeap per bitmap
« Risposta #1 il: 26 Gennaio 2012, 13:23:36 CET »
+1
La sparo li, se se provi a mettere tutto a null dopo aver chiuso gli stream e riciclato la bitmap?

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:MaxHeap e FreeHeap per bitmap
« Risposta #2 il: 27 Gennaio 2012, 00:18:18 CET »
0
uhm...avevo provato a rendere null un paio di cose..ma non tutto..
domani mattina ci provo e vediamo...speriamo bene :D
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:MaxHeap e FreeHeap per bitmap
« Risposta #3 il: 27 Gennaio 2012, 18:25:10 CET »
0
niente da fare..ho provato a inserire:
Codice (Java): [Seleziona]
                bos.flush();
                bos.close();
                    myImage1.recycle();// provo a cancellarla dopo l'uso
                    _data=null;
                    bos=null;
                    fileOutputStream=null;
                    myImage1=null;
                        mSurfaceView=null;
                        mSurfaceHolder=null;
ma il probema si ripete ancora..nessuno ha idea di come liberare la memoria heap?
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:MaxHeap e FreeHeap per bitmap
« Risposta #4 il: 27 Gennaio 2012, 18:55:53 CET »
+1
Molto probabilmente hai almeno un memory leak nel tuo codice il quale satura tutta la memoria a disposizione per le bitmap.

Qui trovi un video e dei PDF che spiegano il problema e come individuarlo con i tool di Android e un plugin di Eclipse:

http://www.google.com/events/io/2011/sessions/memory-management-for-android-apps.html
adb logcat | tee /tmp/logcat | grep TAG

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:MaxHeap e FreeHeap per bitmap
« Risposta #5 il: 28 Gennaio 2012, 13:13:26 CET »
0
grazie mille ice..ora mi guardo bene queste cose...penso facciano proprio al caso mio
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:MaxHeap e FreeHeap per bitmap
« Risposta #6 il: 28 Gennaio 2012, 13:35:39 CET »
0
ho provato a forzare il garbage dopo ogni scatto e il problema sembra essersi risolto..
son riuscito a fare 100 scatti consecutivi senza alcun errore..
ora comunque proverò a seguire quello che diceva ice, per verificre con i tool dove era il memory leak..se trovo qualche info importante ve la posto cosi potra servire anche a altri ^^
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!