Usei / proc / meminfo e analisei a resposta do comando. No entanto, o resultado mostra que:
MemTotal: 94348 kB MemFree: 5784 kB
significa. mostra que há apenas 5 MB de memória livre. É possível com o Android móvel? Há apenas 5-6 aplicativos instalados no meu celular e nenhuma outra tarefa está em execução. mas ainda assim este comando mostra que há muito pouca memória livre.
Alguém pode esclarecer isso? ou existe alguma outra maneira de obter o uso de memória no Android?
android
memory-management
Badal
fonte
fonte
Debug.getNativeHeapFreeSize()
.Respostas:
CUIDADO: Esta resposta mede o uso / disponibilidade da memória do DISPOSITIVO. NÃO é isso que está disponível para seu aplicativo. Para medir o que seu APP está fazendo e tem permissão para fazer, use a resposta do desenvolvedor do Android .
Documentos Android - ActivityManager.MemoryInfo
comando parse / proc / meminfo. Você pode encontrar o código de referência aqui: Obtenha o uso da memória no Android
use o código abaixo e obtenha RAM atual:
Explicação do número 0x100000L
É bastante óbvio que o número é usado para converter de bytes em mebibyte
PS: precisamos calcular a memória total apenas uma vez. então chame o ponto 1 apenas uma vez em seu código e depois, você pode chamar o código do ponto 2 repetidamente.
fonte
Depende da sua definição de qual consulta de memória você deseja obter.
Normalmente, você gostaria de saber o status da memória heap, uma vez que se ela usar muita memória, você obtém OOM e falha o aplicativo.
Para isso, você pode verificar os próximos valores:
Quanto mais a variável "usedMemInMB" se aproxima de "maxHeapSizeInMB", quanto mais perto
availHeapSizeInMB
chega de zero, mais perto você obtém OOM. (Devido à fragmentação da memória, você pode obter OOM ANTES de chegar a zero.)Isso também é o que mostra a ferramenta DDMS de uso de memória.
Alternativamente, existe o uso real de RAM, que é quanto todo o sistema usa - veja a resposta aceita para calcular isso.
Atualização: como o Android O faz seu aplicativo também usar a RAM nativa (pelo menos para armazenamento de bitmaps, que geralmente é o principal motivo para o uso excessivo de memória), e não apenas o heap, as coisas mudaram e você obtém menos OOM (porque o heap não contém mais bitmaps, verifique aqui ), mas você ainda deve ficar de olho no uso da memória se suspeitar que há vazamentos de memória. No Android O, se você tiver vazamentos de memória que deveriam ter causado OOM em versões mais antigas, parece que ele irá travar sem que você consiga detectá-lo. Veja como verificar o uso de memória:
Mas acredito que seja melhor usar o profiler do IDE, que mostra os dados em tempo real, usando um gráfico.
Portanto, a boa notícia no Android O é que é muito mais difícil travar devido ao OOM de armazenar muitos bitmaps grandes, mas a má notícia é que não acho que seja possível detectar tal caso durante o tempo de execução.
EDIT: parece
Debug.getNativeHeapSize()
mudar com o tempo, pois mostra a memória máxima total para seu aplicativo. Portanto, essas funções são usadas apenas para o criador de perfil, para mostrar o quanto seu aplicativo está usando.Se você deseja obter o total real e a RAM nativa disponível, use:
fonte
Esta é uma maneira de calcular o uso de memória do aplicativo em execução :
fonte
Runtime.freeMemory()
retorna 0 eRuntime.totalMemory()
retorna apenas a memória atualmente alocada.Outra forma (atualmente mostrando 25 MB livres no meu G1):
fonte
A filosofia de gerenciamento de memória do Linux é "Memória livre é memória desperdiçada".
Presumo que as próximas duas linhas mostrarão quanta memória há em "Buffers" e quanta está em "Cache". Embora haja uma diferença entre os dois (por favor, não pergunte qual é essa diferença :) ambos somam aproximadamente a quantidade de memória usada para armazenar dados e metadados do arquivo em cache.
Um guia muito mais útil para liberar memória em um sistema Linux é o
free(1)
comando; na minha área de trabalho, ele relata informações como esta:A linha +/- buffers / cache: é a linha mágica, ela relata que eu realmente tenho cerca de 589 megs de memória de processo ativamente exigida e cerca de 5391 megs de memória 'livre', no sentido de que os 91 + 374 megabytes de buffers / memória em cache podem ser descartados se a memória pudesse ser usada de forma mais lucrativa em outro lugar.
(Minha máquina está ligada há cerca de três horas, fazendo quase nada além de stackoverflow, e é por isso que tenho tanta memória livre.)
Se o Android não for fornecido
free(1)
, você mesmo pode fazer as contas com o/proc/meminfo
arquivo; Eu apenas gosto dofree(1)
formato de saída. :)fonte
cat /proc/meminfo
. É muito mais detalhado, masMemFree
.Buffers
eCached
são provavelmente as linhas mais importantes.Refiro-me a alguns escritos.
referência:
Este método getMemorySize () é retornado como MemorySize com tamanho de memória total e livre.
Eu não acredito neste código perfeitamente.
Este código está sendo testado no LG G3 cat.6 (v5.0.1)
Eu sei que Pattern.compile () tem um custo caro, então você pode mover seu código para o membro da classe.
fonte
Eu olhei para Android Source Tree.
Dentro de com.android.server.am. ActivityManagerService.java (serviço interno exposto por android.app. ActivityManager ).
Dentro de android.os. Process.java
Ele chama o método JNI de android_util_Process.cpp
Conclusão
MemoryInfo.availMem = MemFree + Armazenado em cache em / proc / meminfo.
Notas
Memória total é adicionada no nível 16 da API.
fonte
você também pode usar a ferramenta DDMS que faz parte do próprio SDK do Android. ele ajuda a obter alocações de memória de código java e código c / c ++ nativo também.
fonte
fonte
É um código estranho. Ele retorna MaxMemory - (totalMemory - freeMemory). Se freeMemory for igual a 0, o código retornará MaxMemory - totalMemory, portanto, pode ser maior ou igual a 0. Por que freeMemory não foi usado?
fonte
Esta é outra maneira de visualizar o uso de memória do seu aplicativo:
Saída de amostra:
Para uso geral de memória:
https://developer.android.com/studio/command-line/dumpsys#meminfo
fonte