Descarte de guias no Google Chrome: um experimento de economia de memória

Addy Osmani
Addy Osmani

Reduzir o consumo de memória do Chrome é uma das principais prioridades da equipe este ano. Já notamos uma redução de até 45% no uso de memória do Gmail graças às melhorias no processo de coleta de lixo do V8, mas estamos apenas começando. Um dos nossos próximos experimentos no uso de memória é voltado a colecionadores de guias (como eu). Esse recurso é chamado de descartar de tabulação.

Nem todas as guias abertas são usadas. Se a memória estiver baixa, o Chrome poderá descartar guias que não são interessantes em segundo plano.

O descarte de guias está disponível como um experimento no Chrome 46 e versões mais recentes.

Contexto

Para cada guia aberta, nosso processo de renderização geralmente leva cerca de 50 MB por guia, mesmo que a maioria das pessoas use apenas uma guia por vez. Se você tiver 10 guias abertas, estará usando pelo menos 450 MB de memória apenas para manter o estado da guia em segundo plano. Isso pode ficar um pouco complicado com o tempo.

Memória necessária por guia

Um dos nossos objetivos é reduzir a memória das guias que você não está usando. Se eu observar quais guias estão consumindo a memória do meu sistema no gerenciador de tarefas do Chrome, estou apenas "usando" um ou dois dos sites abaixo, enquanto as outras guias em segundo plano não são usadas.

Gerenciador de tarefas de memória necessária

É por isso que descartar guias pode ajudar a reduzir o uso da memória.

Como descartar guias não usadas

O descarte de guias permite que o Chrome descarte automaticamente guias que não são tão interessantes para você quando é detectado que a memória do sistema está muito baixa. O que queremos dizer com descarte? Uma guia descartada não leva a lugar nenhum. Ele será eliminado, mas ele ainda estará visível na barra de guias do Chrome. Se você voltar para uma guia que foi descartada, ela vai ser atualizada quando clicada. O conteúdo do formulário, a posição de rolagem e assim por diante são salvos e restaurados da mesma forma que seriam durante a navegação para frente/para trás com a guia.

Também temos outro novo recurso que permite armazenar em cache todos os recursos da guia localmente, o que funciona bem com o descarte de guias quando você está off-line. Quando a guia é reativada, oferecemos a opção de recarregar a versão em cache que foi carregada anteriormente pela rede. Para ativar o recarregamento da página a partir do cache, teste outro experimento em chrome://flags/#show-saved-copy.

Teste o descarte de guias hoje mesmo. Basta ativá-lo usando a chrome://flags/#enable-tab-discarding e reiniciar o Chrome. É possível controlar se ele está ativado ou desativado na mesma página chrome://flags do Chrome.

Ativar captura de tela de descarte de guias.
Captura de tela do botão "Reiniciar".

Uma nova página chamada chrome://discards permite listar quais guias estão abertas no momento e tentamos compartilhar alguns insights sobre o quanto elas são interessantes para você, do mais ao menos.

Captura de tela da página de guias descartadas.

Para testar o recurso, você pode executar seu comportamento normal de navegação até que o sistema esteja em um modo de pouca memória ou, como alternativa, acionar um descarte de guias de about:discards clicando em "Descartar guia agora". Isso vai descartar a última guia da lista. Também é possível descartar uma guia específica da lista clicando no botão "Descartar" correspondente. Uma guia descartada será mostrada com um prefixo [Descartar].

Captura de tela com exemplo de guia descartada.

Ao descartar guias, estas são descartadas nesta ordem:

  • Páginas internas, como página nova guia, favoritos etc.
  • Guias selecionadas há muito tempo
  • Guias selecionadas recentemente
  • Apps em execução em uma janela
  • Guias fixadas
  • Guia selecionada

Ativamos o experimento de descarte de guias no Chrome Canary para Windows e Mac OS, e uma implementação para Linux será lançada em breve.

As guias fixadas também são consideradas ao decidir se uma guia deve ser descartada.

Inspiração: olá, suspensório ótimo

Se o descarte de guias parece familiar, é porque você provavelmente já conhece extensões úteis do Chrome que oferecem uma versão um pouco mais simples dessa ideia, como a Grande Suspensório. O objetivo da Great Suspend é reduzir o consumo de memória e de GPU do Chrome, suspendendo as guias após um período personalizado de inatividade.

Captura de tela da suspensório.

Assim como o descarte de guias, a suspensão pode ser cancelada quando você precisar interagir com elas novamente. A Great Suspender mantém o título e o favicon de cada guia, mostrando as guias suspensas em um estado esmaecido, facilitando a navegação de volta para elas a qualquer momento.

Captura de tela do favicon de guias suspensas.

As guias em segundo plano que não estou usando foram suspensas, economizando memória. As guias que ainda uso ativamente (GitHub e YouTube) estão sendo executadas normalmente.

Na verdade, conversamos muito com o autor da extensão Great Suspensório enquanto desenvolve o descarte de guias, e ele ainda está feliz em ver nossa solução nativa para esse problema de maneiras mais eficientes do que uma extensão poderia, por exemplo, perder o estado de inatividade do usuário.

Melhorias futuras: o serializador de guias

O serializador de guias é um trabalho futuro que pode levar a melhorias significativas na abordagem atual de descarte de guias. Ele usa o conteúdo de uma guia do Chrome e serializa o estado *atual* dela em um blob binário. Esse blob binário pode ser desserializado posteriormente em uma guia.

O serializador serializa quase tudo que o Chrome, o Blink e o V8 precisam para preservar corretamente uma guia (algo que as extensões do Chrome que lidam com esse problema historicamente não conseguiam alcançar facilmente). A serialização incluiria os suspeitos comuns: o DOM (com muitos WebGL e Canvas incluídos), CSS e o estado da VM JavaScript V8.

Captura de tela do conceito do serializador

Se você usa o Android ou o ChromeOS, talvez saiba que, de forma semelhante ao experimento de descarte de guias abordado nesta postagem, encerramos as guias em segundo plano de forma agressiva para garantir que o uso da memória seja baixo. O problema com a maneira como lidamos com isso é que sua guia perderia *todo* o estado.

Quando você mostrasse interesse na guia novamente, precisaríamos recarregá-la e toda a interação com ela seria perdida. O serializador de guias apenas aborda esse problema de uma maneira que faz com que você volte quase exatamente ao que era sem precisar voltar à rede. Esperamos compartilhar mais informações sobre esse trabalho posteriormente.

Teste o descarte de guias e nos conte o que achou

Gostaríamos de saber se esse recurso é útil para você e como é possível melhorá-lo. Faça um teste, use o recurso (principalmente se você for um colecionador de guias) e conte para nós o que achou nos comentários. :) Também gostaríamos que você enviasse tíquetes para qualquer bug que encontrar em crbug.com.