ho giocato un po 'di tempo con diverse build della mia applicazione e sembrano accadere cose strane:i file binari a 64 bit del cacao perdono memoria? (Rilasciando NSData non libera memoria)
la mia app ha un ingombro di 5 MB inattivo. quando si carica una memoria di file di dimensioni del file è riservata. dopo il caricamento la memoria riservata deve essere liberata. Non vi sono differenze nella costruisce (gc = garbage collector):
- 32bit i386 no-GC: tutta la memoria viene liberato immediatamente.
- GC i386 a 32 bit: quasi tutta la memoria viene liberata all'istante. il resto qualche tempo dopo.
- 64 bit x86_64 no-GC: la memoria minima viene liberata. come 10%
- 64 bit x86_64 GC: nessuna memoria viene liberata. la memoria rimane riservata per ore. (attività mon)
sto utilizzando LLVM con CLANG. Ho eseguito gli strumenti di oggi tutto il tempo e stavo controllando perdite/zombi/ecc. e tutto sembra essere pulito. (l'app è piuttosto semplice)
c'è una spiegazione per questo comportamento?
Aggiornamento:
Ecco alcune cose strane. Ho risolto il problema:
Carico un file 20mb in un NSData e lo rilascio. Lo sto facendo senza abilitare la garbage collection. Il codice è:
NSData *bla = [[NSData alloc] initWithContentsOfFile:@"/bigshit"];
[bla release];
Quando costruisco per i386 32bit, i 20mb vengono allocati e rilasciati. Quando cambio la build su 64bit x86_64 il rilascio non fa nulla. Il soggiorno di 20mb è stato assegnato.
upper pic 32bit lower 64 http://kttns.org/zguxn
Non c'è differenza tra le due applicazioni, tranne che quello superiore è costruito per 32bit e quello inferiore 64 bit. Non c'è GC in esecuzione. (Con GC abilitata appare lo stesso problema.)
Aggiornamento 2:
lo stesso comportamento può essere osservato quando creo una nuova applicazione di cacao da zero con solo il codice in alto a applicationDidFinishLaunching :. In modalità 64 bit la memoria non viene rilasciata. i386 funziona come previsto.
Lo stesso problema si verifica con NSString anziché NSData. Appare anche quando avvio il kernel a 64 bit. (Tenendo 64 all'avvio.)
OS è 10.6.0
Si è tentato di allocare e deallocare molte istanze NSData per vedere se la memoria perché qualcuno di loro è reclamato? Potrebbe essere che il programma non restituisca la memoria al sistema operativo a meno che non vi sia una carenza di memoria. – Amok
Ho appena provato a riprodurlo su 10.6 senza fortuna. Hai archiviato un bug con la tua app di test? – Ken
La tua app funziona correttamente e non perde memoria. Vedi la mia risposta qui sotto per una spiegazione semi-dettagliata. – bbum