É possível gravar vários tipos de perfis de performance no Android. A coleta de um perfil ajuda a depurar problemas relacionados à velocidade de execução do app, à quantidade de memória usada, à quantidade de energia consumida e muito mais.
Este documento descreve os tipos de perfis mais úteis e quando usar cada um deles para depurar problemas comuns de performance.
Rastreamentos do sistema
Um rastreamento do sistema é um perfil avançado que contém informações sobre processos, linhas de execução, informações de tempo, execução de CPU e tarefas e eventos definidos pelo sistema ou pelo usuário.
Do ponto de vista do app, a natureza das informações nos rastreamentos pode abranger uma ampla variedade de áreas, incluindo latência, instabilidade, memória, bateria e muito mais.
Os rastreamentos do sistema contêm os seguintes eventos orientados por código que podem ser definidos pelo sistema ou pelo usuário. Os eventos orientados por código são eventos que os usuários podem acionar por chamadas de função.
- Fatias de rastreamento: representam o tempo entre diferentes pontos no código. Elas
podem ser adicionadas com
Trace.beginSectioneTrace.endSectionAPIs. - Contadores de rastreamento: valores numéricos que representam métricas, por exemplo, o tamanho do heap. Eles podem ser adicionados com
Trace.setCounterAPI.
Os rastreamentos do sistema também contêm métricas que podem ser criadas a partir de consultas PerfettoSQL e usadas para realizar análises ou comparar rastreamentos.
Recomendamos o uso de rastreamentos do sistema para realizar as seguintes tarefas:
Diagnosticar problemas de latência Os rastreamentos do sistema são excelentes para encontrar problemas de latência causados por atrasos, esperas ou problemas de programação. Outros criadores de perfil, como perfis baseados em amostras, não fornecem as informações de tempo que os rastreamentos do sistema oferecem.
Encontrar cálculos duplicados. O rastreamento pode revelar se determinados cálculos estão sendo repetidos, o que pode indicar operações desnecessárias.
Diagnosticar problemas de contenção de bloqueio. Com informações sobre estados e fatias de linhas de execução que mostram quando os recursos estão bloqueados, é possível identificar se os bloqueios (como
synchronizedblocos) estão causando atrasos nas jornadas do usuário.Entender a multithreading no app : os rastreamentos oferecem uma visualização de várias linhas de execução, mostrando o estado de cada linha e as fatias de rastreamento adicionadas pelo sistema ou pelo app. Essa visualização multithread ajuda a entender quais linhas de execução estão ativas, inativas ou o que elas estão executando e como interagem.
Realizar análises de performance complexas. A interface do usuário avançada e a capacidade de mostrar vários tipos de informações tornam os rastreamentos do sistema úteis para depurar uma ampla variedade de problemas de performance, incluindo latência, memória e uso da bateria.
Os rastreamentos do sistema também oferecem suporte a consultas usando PerfettoSQL. Esse recurso avançado permite:
- Extrair dados específicos.
- Transformar dados de rastreamento em métricas personalizadas.
- Criar faixas de depuração de consultas para facilitar a visualização das coisas mais importantes na interface do Perfetto.
- Realizar análises complexas diretamente na interface do Perfetto.
Perfis de amostra de pilha
Os perfis de amostra de pilha funcionam gravando amostras de execução de código e armazenando as informações da pilha de chamadas em uma taxa definida enquanto uma linha de execução está executando tarefas na CPU. Isso fornece insights sobre o que o código está fazendo durante a execução.
Recomendamos o uso de amostras de pilha para fazer o seguinte:
- Otimizar pontos de acesso. As amostras de pilha ajudam a identificar partes do código com a muita atividade da CPU, o que significa que a linha de execução está frequentemente em um estado "em execução".
- Entender a execução do código. As amostras de pilha podem ajudar a entender o comportamento geral da base de código.
- Identificar o código que não deve ser executado. É possível encontrar pilhas de chamadas que não deveriam ser executadas, o que aponta para oportunidades imediatas de otimização.
Heap dumps
Os heap dumps do Java mostram um snapshot da memória de heap do Java do app. Esse snapshot inclui todos os objetos e como eles se referem uns aos outros no momento em que o dump foi feito.
Recomendamos coletar heap dumps para fazer o seguinte:
- Descobrir objetos duplicados. Os heap dumps mostram o número de objetos ativos, o que é útil para rastrear objetos duplicados. Eles também fornecem referências de objetos, ajudando a identificar o local do código em que os objetos foram criados.
- Encontrar vazamentos de memória. Os heap dumps podem revelar a memória que não deveria mais estar em uso quando o dump foi feito, indicando possíveis vazamentos de memória.
- Identificar objetos que podem ser otimizados. Ao mostrar objetos que usam a muita memória e suas contagens, os heap dumps ajudam a identificar padrões de uso de memória ineficientes.
Perfis de alocação heap
Os perfis de alocação heap vêm nas versões nativa e Java e são excelentes para depurar problemas de memória. Eles são semelhantes às amostras de pilha de chamadas, mas, em vez de medir ciclos de CPU, eles fazem amostras quando a memória é alocada.
Recomendamos o uso de perfis de alocação heap para realizar o seguinte:
- Reduzir a rotatividade de memória Os perfis de alocação heap fornecem amostras com locais de código para alocações de memória. Isso ajuda a identificar áreas que criam muitos objetos temporários, o que pode contribuir para coletas de lixo (GCs) frequentes no app.
- Descobrir vazamentos de memória. Os perfis de alocação heap podem ser usados com outros perfis de memória para diagnosticar e corrigir vazamentos de memória. Eles ajudam a identificar locais que estão alocando muito mais memória do que o esperado.
Combinar perfis
Muitas vezes, você vai analisar a performance usando um único perfil. No entanto, a coleta de vários perfis ou um único perfil combinado pode fornecer uma imagem mais completa e ajudar a diagnosticar problemas complexos que um único perfil não consegue.
Considere estes cenários em que a combinação de perfis é benéfica:
Cenário 1: investigar código não instrumentado. Um rastreamento do sistema pode mostrar a latência de operações que você já instrumentou. No entanto, talvez você precise mais informações sobre partes não instrumentadas do código em execução durante esses períodos. Para investigar, faça um perfil de pilha de chamadas para entender o código executado. Essas informações podem ajudar a melhorar o rastreamento adicionando mais fatias de rastreamento.
Cenário 2: analisar vazamentos de memória e coletas de lixo. Imagine que um rastreamento do sistema mostre um aumento constante na memória de heap do Java devido a alocações, acionando coletas de lixo (GCs) frequentes. Para entender os objetos alocados, faça um perfil de alocação heap ou um heap dump. Essa abordagem combinada ajuda a identificar maneiras de reduzir o uso de memória. Por exemplo, reduzir alocações desperdiçadas ou otimizáveis usando o armazenamento em cache pode impedir que as GCs ocorram.