Eu desenvolvi um aplicativo para Android e estou no ponto de desenvolvimento de um aplicativo para telefone em que tudo parece estar funcionando bem e você deseja declarar vitória e sucesso, mas você sabe que deve haver algum vazamento de memória e recursos lá; e há apenas 16 MB de pilha no Android e é aparentemente surpreendentemente fácil vazar em um aplicativo Android.
Eu estive olhando ao redor e até agora só consegui descobrir informações sobre 'hprof' e 'traceview' e nem recebe muitas críticas favoráveis.
Quais ferramentas ou métodos você encontrou ou desenvolveu e gostaria de compartilhar talvez em um projeto de sistema operacional?
android
memory-leaks
jottos
fonte
fonte
Respostas:
Um dos erros mais comuns que encontrei no desenvolvimento de aplicativos Android é o erro "java.lang.OutOfMemoryError: tamanho do bitmap excede o orçamento da VM". Encontrei esse erro com freqüência em atividades usando muitos bitmaps após alterar a orientação: a atividade é destruída, criada novamente e os layouts são "inflados" a partir do XML que consome a memória da VM disponível para bitmaps.
Os bitmaps no layout de atividade anterior não são desalocados adequadamente pelo coletor de lixo porque eles cruzaram as referências à sua atividade. Depois de muitas experiências, encontrei uma solução muito boa para esse problema.
Primeiro, defina o atributo "id" na visualização pai do seu layout XML:
Em seguida, no método onDestroy () da sua Activity, chame o método unbindDrawables () passando uma referência para a View pai e, em seguida, faça um System.gc ()
Este método unbindDrawables () explora a árvore de exibição recursivamente e:
fonte
PageAdapter
e eu estou ficando trabalhada por este erro :(Obtenha o Eclipse Memory Analyzer ( http://www.eclipse.org/mat/ ) Verifique http://kohlerm.blogspot.com/2010/02/android-memory-usage-analysis-slides.html e http: // kohlerm.blogspot.com/search/label/memory
fonte
Principalmente para os viajantes do Google no futuro:
Infelizmente, a maioria das ferramentas java não é adequada para essa tarefa, porque elas analisam apenas o JVM-Heap. Porém, todo aplicativo Android também possui uma pilha nativa, que também deve se ajustar ao limite de ~ 16 MB. Geralmente é usado para dados de bitmap, por exemplo. Portanto, você pode executar com facilidade os erros de Falta de Memória, mesmo que sua JVM-Heap esteja em torno de 3 MBs, se você usar muitas gavetas.
fonte
A resposta do @ hp.android funciona bem se você estiver trabalhando apenas com planos de fundo de bitmap, mas, no meu caso, eu forneci
BaseAdapter
um conjunto deImageView
s para aGridView
. Modifiquei ounbindDrawables()
método conforme recomendado para que a condição seja:mas o problema é que o método recursivo nunca processa os filhos do
AdapterView
. Para resolver isso, fiz o seguinte:para que os filhos do
AdapterView
ainda sejam processados - o método simplesmente não tenta remover todos os filhos (o que não é suportado).No entanto, isso não resolve o problema, já que
ImageView
s gerenciamos um bitmap que não é o fundo deles. Eu, portanto, adicionei o seguinte. Não é o ideal, mas funciona:No geral, o
unbindDrawables()
método é então:Espero que exista uma abordagem mais baseada em princípios para liberar esses recursos.
fonte
Boa palestra de E / S do Google (2011) sobre Gerenciamento de memória no Android, além de detalhes sobre ferramentas + técnicas para criação de perfil de memória:
http://www.youtube.com/watch?v=_CruQY55HOk
fonte
O Valgrind foi portado para o Android (patrocinado pela Mozilla). Consulte Valgrind no Android - Status atual e suporte Executando o Valgrind para Android no ARM (comentário 67).
fonte
Bem, essas são as ferramentas que combinam com os formatos exclusivos que o Android usa. Acho que você pode não estar satisfeito com a estrutura de código de teste subjacente em uso.
Você tentou testar áreas de código simuladas usando o Android Mock Framework?
fonte