Tenho visto muitas respostas do Android que sugerem chamar o coletor de lixo em algumas situações.
É uma boa prática solicitar o coletor de lixo no Android antes de fazer uma operação que consome muita memória? Caso contrário, devo chamá-lo apenas se receber um OutOfMemory
erro?
Há outras coisas que devo usar antes de recorrer ao coletor de lixo?
fonte
De modo geral, na presença de um coletor de lixo, nunca é uma boa prática chamar manualmente o GC. Um GC é organizado em torno de algoritmos heurísticos que funcionam melhor quando deixados por conta própria. Chamar o GC manualmente geralmente diminui o desempenho.
Ocasionalmente , em algumas situações relativamente raras, pode-se descobrir que um determinado GC está errado e uma chamada manual para o GC pode melhorar as coisas em termos de desempenho. Isso ocorre porque não é realmente possível implementar um GC "perfeito" que gerenciará a memória de forma otimizada em todos os casos. Essas situações são difíceis de prever e dependem de muitos detalhes sutis de implementação. A "boa prática" é deixar o GC funcionar sozinho; uma chamada manual para o CG é a exceção, que deve ser prevista somente após um problema de desempenho real ter sido devidamente testemunhado.
fonte
Bitmap.finalize()
métodos que liberam a memória não-VM). Portanto, neste caso, você deve passar por cima da cabeça do GC e executarBitmap.recycle()
ouSystem.gc()
onde for apropriado. Mas apenas pré-favo de mel.Falta de memória no aplicativo Android é muito comum se não manusearmos o bitmap adequadamente. A solução para o problema seria
No código acima, tentei reciclar o bitmap, o que permitirá que você libere o espaço de memória usado, portanto, a falta de memória pode não acontecer. Tentei funcionar para mim.
Se ainda estiver enfrentando o problema, você também pode adicionar essas linhas
para mais informações, dê uma olhada neste link
https://web.archive.org/web/20140514092802/http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html?cat=59
NOTA: Devido ao momentânea "pausa" causada pela realização de gc, é que não é recomendado para fazer isso antes de cada alocação de bitmap.
O design ideal é:
Libertar todos os bitmaps que já não são necessários , pelo
if / recycle / null
código mostrado. (Faça um método para ajudar nisso.)System.gc();
Aloque os novos bitmaps.
fonte
Se você obtiver um OutOfMemoryError, geralmente é tarde demais para chamar o coletor de lixo ...
Aqui está uma citação do desenvolvedor Android:
Portanto, no meu entendimento, não há necessidade urgente de ligar para o gc. É melhor despender mais esforço para evitar a criação desnecessária de objetos (como a criação de objetos dentro de loops)
fonte
Parece
System.gc()
não funcionar no Art Android 6.0.1 Nexus 5x, então eu uso em seuRuntime.getRuntime().gc();
lugar.fonte
System.gc()
é uma função de wrapper paraRuntime.getRuntime().gc()
. Consulte android.googlesource.com/platform/libcore/+/…System.gc()
não funciona para mim, masRuntime.getRuntime().gc()
funciona!Meu aplicativo gerencia muitas imagens e morreu com um OutOfMemoryError. Isso me ajudou. No Manifest.xml Adicionar
fonte
De um modo geral, você não deve chamar GC explicitamente com System.gc (). Existe até a palestra IO ( http://www.youtube.com/watch?v=_CruQY55HOk ) onde eles explicam o que o log de pausas do GC significa e na qual eles também afirmam para nunca chamar System.gc () porque Dalvik sabe melhor do que você quando fazê-lo.
Por outro lado, como mencionado nas respostas acima, o processo de GC no Android (como tudo o mais) às vezes apresenta erros. Isso significa que os algoritmos Dalvik GC não estão no mesmo nível dos JVMs Hotspot ou JRockit e podem errar em algumas ocasiões. Uma dessas ocasiões é ao alocar objetos de bitmap. Isso é complicado porque usa memória Heap e Non Heap e porque uma instância solta de objeto de bitmap no dispositivo com restrição de memória é suficiente para fornecer uma exceção OutOfMemory. Portanto, chamá-lo depois de não precisar mais desse bitmap é geralmente sugerido por muitos desenvolvedores e até considerado uma boa prática por algumas pessoas.
A prática recomendada é usar .recycle () em um bitmap, pois é para isso que esse método foi feito, pois ele marca a memória nativa do bitmap como segura para exclusão. Tenha em mente que isso depende muito da versão, o que significa que geralmente será necessário em versões mais antigas do Android (Pre 3.0, eu acho), mas não será necessário em versões posteriores. Também não vai doer muito usá-lo em versões mais novas do ether (apenas não faça isso em um loop ou algo parecido). O novo tempo de execução do ART mudou muito aqui porque eles introduziram uma "partição" especial do Heap para objetos grandes, mas acho que não vai doer muito fazer isso com o ART ether.
Também uma observação muito importante sobre System.gc (). Este método não é um comando ao qual Dalvik (ou JVMs) são obrigados a responder. Considere isso mais como dizer à máquina virtual "Você poderia fazer a coleta de lixo se não for um incômodo".
fonte
A melhor maneira de evitar OOM durante a criação de bitmap,
http://developer.android.com/training/displaying-bitmaps/index.html
fonte
Eu diria que não, porque os documentos do desenvolvedor sobre o estado de uso de RAM :
Eu destaquei a parte relevante em negrito.
Ter um olhar para a série YouTube, do Android Performance Patterns - que irá mostrar-lhe dicas sobre o gerenciamento de uso de memória do seu aplicativo (como o uso do Android de
ArrayMap
s eSparseArray
s em vez deHashMap
s).fonte
Nota rápida para desenvolvedores Xamarin .
Se você gostaria de chamar
System.gc()
em aplicativos Xamarin.Android você deve chamarJava.Lang.JavaSystem.Gc()
fonte
Não há necessidade de chamar o coletor de lixo após um
OutOfMemoryError
.Seu Javadoc afirma claramente:
Portanto, o coletor de lixo já tentou liberar memória antes de gerar o erro, mas não teve êxito.
fonte