Recursos que consomem muita memória

O daemon low memory killer (LMK) do Android monitora o estado da memória de um sistema Android em execução e reage à alta pressão de memória encerrando os processos menos essenciais. O Android vitals rastreia e informa as finalizações por LMK percebidas pelo usuário no Google Play Console para ajudar você a identificar problemas de pressão de memória que afetam os usuários.

Métrica de LMK no Android vitals

O Android vitals pode ajudar a monitorar e melhorar a taxa de LMK do seu app. O Android vitals mede apenas uma taxa de LMK: a taxa de LMK percebida pelo usuário.

A métrica reflete a porcentagem de usuários ativos por dia que tiveram pelo menos um LMK percebido pelo usuário. Um LMK percebido pelo usuário é um LMK que provavelmente foi notado pelos usuários. Por exemplo, isso inclui LMKs que ocorrem quando o app está exibindo uma atividade ou sendo executado como um serviço em primeiro plano. Essas finalizações resultam em uma saída imediata e não normal do processo. Para o usuário final, parece que o app travou, muitas vezes ignorando os mecanismos padrão de salvamento de estado do ciclo de vida e resultando na perda do progresso do usuário.

O Android vitals se concentra nessas finalizações de processo porque elas servem como um proxy de alta fidelidade para problemas de gerenciamento incorreto de memória. Uma taxa de LMK acima de 1% indica uma necessidade crítica de ação imediata. No entanto, uma taxa de LMK mais baixa não significa necessariamente que o uso da memória do app está íntegro. Essa taxa mais baixa pode significar que o daemon do LMK está encerrando processos com frequência enquanto eles estão em segundo plano, o que prejudica o desempenho da "inicialização a quente" e a fluidez da multitarefa.

A métrica está na seção Estabilidade do Android vitals:

Figura 1. Acesse a Taxa de LMK percebida pelo usuário no Android vitals.

Assim como em outras métricas principais semelhantes, como ANRs e falhas, é possível filtrar as métricas, compará-las com as de apps semelhantes ou monitorar as mudanças por um longo período (até três anos). Os dados estão disponíveis para apps atuais desde 28 de janeiro de 2025.

Figura 2. Visão geral da taxa de LMK no Android vitals.

Como funciona o daemon de encerramento por falta de memória

A plataforma Android está baseada no princípio de que memória livre é memória desperdiçada. O Android tenta usar toda a memória disponível em todos os momentos. Por exemplo, o sistema mantém os apps na memória depois de terem sido fechados para que o usuário possa voltar a eles rapidamente. Por esse motivo, os dispositivos Android geralmente são executados com pouca memória livre (consulte Alocação de memória entre processos).

Para decidir qual processo encerrar quando a memória livre estiver baixa, o daemon do low memory killer (LMK) usa uma pontuação de memória insuficiente chamada oom_adj_score para priorizar os processos em execução. Os processos com maior pontuação são encerrados primeiro. Os apps em segundo plano são encerrados primeiro, e os processos do sistema, por último. A tabela abaixo lista as categorias de pontuação do LMK, da maior para a menor. Os itens da categoria com maior pontuação na primeira linha são encerrados primeiro:

Processos do Android classificados da pontuação mais alta para a mais baixa: apps em segundo plano, app anterior, app Home,
             serviços, apps perceptíveis, aplicativo em primeiro plano, persistente, sistema e nativo.
Figura 3. Processos do Android com pontuações mais altas na parte de cima, e com pontuações mais baixas na parte de baixo.

Ferramentas de criação de perfil de memória

As ferramentas a seguir podem ajudar você a encontrar e diagnosticar problemas de memória das seguintes maneiras:

  • Conferir como o app aloca memória ao longo do tempo. Você pode encontrar um gráfico em tempo real de quanta memória o app está usando, do número de objetos Java alocados e de quando ocorre a coleta de lixo.
  • Iniciar os eventos de coleta de lixo e fazer uma captura de tela do heap Java enquanto o app é executado.
  • Registrar as alocações de memória do app, inspecionar todos os objetos alocados e conferir o stack trace de cada alocação.

Se o jogo estiver sendo executado em um mecanismo nativo, use o HWAddress Sanitizer para depurar a alocação de memória nativa.

Memory Profiler do Android Studio

O Android Studio oferece o Memory Profiler como um componente do Android Profiler que ajuda a identificar vazamentos de memória e rotatividade de memória, que podem gerar renderização lenta, travamentos e até falhas no app. O criador de perfil mostra um gráfico em tempo real do uso da memória pelo app, permite capturar um heap dump, forçar coletas de lixo e rastrear alocações de memória.

Memory Profiler do Android Studio mostrando referências globais de JNI no heap.
Figura 4. Visualização de referências globais de JNI no Memory Profiler do Android Studio.

Ferramentas de criação de perfil de memória do Unity

Se você estiver usando o Unity Engine para criar seus apps, siga as orientações de criação de perfil de memória do Unity. O Unity oferece duas ferramentas para analisar o uso da memória no seu aplicativo.

O primeiro é o módulo Memory Profiler, que é um criador de perfil integrado que fornece informações básicas sobre onde o aplicativo usa memória.

O módulo de memória mostra alocações de memória, como memória de textura e de malha.
Figura 5. Janela do Unity Profiler com o módulo Memory selecionado.

A segunda ferramenta é o pacote Memory Profiler, que é um pacote do Unity que pode ser adicionado ao seu projeto. O pacote adiciona outra janela do Memory Profiler ao Unity Editor. O Memory Profiler permite analisar o uso da memória no seu aplicativo com ainda mais detalhes. É possível armazenar e comparar snapshots para encontrar vazamentos de memória ou ver o layout da memória para encontrar problemas de fragmentação.

Janela do Memory Profiler do Unity mostrando um detalhamento do snapshot de memória.
Figura 6. Análise de um snapshot de memória usando a janela do Memory Profiler.

Para fluxos de trabalho do Unity específicos do Android, consulte Verificar o uso da memória com as ferramentas do Unity, Otimizar o uso da memória no Unity e Depurar LMKs para jogos do Unity.

Unreal Memory Insights

Os apps criados pelo Unreal Engine podem usar o Unreal Memory Insights para ver informações detalhadas sobre alocação e desalocação de memória, incluindo as tags de memória de baixo nível (LLM, na sigla em inglês) e as pilhas de chamadas associadas a blocos de memória.

O sistema de consulta do Memory Insights pode encontrar alocações ativas em qualquer momento, identificar mudanças no uso da memória, localizar vazamentos de memória e diferenciar alocações de curto e longo prazo.

A partir do UE 5.4, o Memory Insights oferece suporte ao rastreamento de memória com pilhas de chamadas para projetos do Android.

Rastreador do Memory Insights mostrando o gráfico da memória principal, a contagem de alocações em tempo real e a contagem de eventos de alocação/liberação.
Figura 7. Rastreador do Memory Insights da Unreal.

Para fluxos de trabalho do Unreal específicos do Android, consulte Verificar o uso da memória com o Unreal e Otimizar o uso da memória no Unreal.

Insights sobre pouca memória

O Android oferece callbacks e APIs que permitem reduzir o uso da memória do jogo e determinar por que as execuções anteriores foram encerradas.

Callbacks

Não se registre para callbacks trim descontinuados. O Android não oferece APIs para detectar eventos de pressão de memória nativa antes que o sistema recupere a memória, e os callbacks de corte de memória em execução detalhados (TRIM_MEMORY_RUNNING_*) não têm sido eficazes na prevenção de encerramentos por falta de memória. Como resultado, o Android descontinuou todos os níveis de corte, exceto TRIM_MEMORY_UI_HIDDEN e TRIM_MEMORY_BACKGROUND. Use esses callbacks restantes ou equivalentes do ciclo de vida do mecanismo, como OnApplicationPause do Unity e ApplicationWillEnterBackgroundDelegate do Unreal, para liberar a IU e os recursos auxiliares quando o jogo for para o segundo plano. Para detalhes da implementação, consulte Reduzir a memória em jogos.

Encerramento do jogo

O Android tenta usar toda a memória disponível para armazenar apps e jogos em cache, garantindo que eles carreguem rapidamente (melhorando a experiência do usuário). No entanto, quando a memória fica limitada, o sistema encerra os apps e jogos que mais consomem memória para liberar espaço para o funcionamento normal do dispositivo.

As informações, os insights e as práticas recomendadas para ajudar você a melhorar o uso da memória do jogo incluem:

  • Use ApplicationExitInfo: essa API retorna o motivo pelo qual a execução anterior do jogo foi encerrada pelo sistema Android. Use ApplicationExitInfo para verificar se há pouca memória (REASON_LOW_MEMORY) ou encerramentos do limitador de memória (REASON_MEMORY_LIMITER) como o motivo de uma saída de processo anterior. Consulte ApplicationExitInfo para jogos. Verifique se o jogo foi encerrado devido à pressão da memória para que ele possa ser otimizado para usar menos memória nesse dispositivo.
  • Analise a RAM física total: para evitar que os jogos sejam encerrados quando estiverem em primeiro plano e para corresponder aos recursos do dispositivo, analise a RAM física total por dispositivo para ter uma granularidade fina e ajustar o uso da memória do jogo com base nisso. Se o objetivo é evitar que os apps sejam encerrados logo depois de serem movidos para o segundo plano (para permitir que o jogador realize várias tarefas ao mesmo tempo), use os callbacks de redução (TRIM_MEMORY_UI_HIDDEN, especificamente) para diminuir o uso da memória do jogo.

Outros recursos