Otimizar memória

Esta página descreve como limitar e reduzir a memória usada pelo Bazel.

Executar o Bazel com RAM limitada

Em algumas situações, talvez você queira que o Bazel use o mínimo de memória. É possível definir o heap máximo usando a flag de inicialização --host_jvm_args, como --host_jvm_args=-Xmx2g.

Trocar velocidades de build incrementais por memória

Se os builds forem muito grandes, o Bazel poderá gerar um OutOfMemoryError (OOM) quando não tiver memória suficiente. É possível fazer com que o Bazel use menos memória, ao custo de builds incrementais mais lentos, transmitindo as seguintes flags de comando: --discard_analysis_cache, --nokeep_state_after_build, e --notrack_incremental_state.

Essas flags vão minimizar a memória que o Bazel usa em um build, ao custo de tornar os builds futuros mais lentos do que um build incremental padrão.

Também é possível transmitir qualquer uma dessas flags individualmente:

  • --discard_analysis_cache reduz a memória usada durante a execução (não a análise). Os builds incrementais não precisam refazer o carregamento de pacotes, mas precisam refazer a análise e a execução (embora o cache de ações no disco possa impedir a maioria das novas execuções).
  • --notrack_incremental_state não armazena nenhuma borda no gráfico de dependência interno do Bazel, de modo que ele não possa ser usado para builds incrementais. O próximo build vai descartar esses dados, mas eles serão preservados até então para depuração interna, a menos que --nokeep_state_after_build seja especificado.
  • --nokeep_state_after_build descarta todos os dados após o build, de modo que os builds incrementais precisam ser criados do zero (exceto para o cache de ações no disco). Sozinho, ele não afeta a marca d'água do build atual.

Trocar a flexibilidade do build por memória com o Skyfocus (experimental)

Se você quiser que o Bazel use menos memória e mantenha as velocidades de build incrementais, informe ao Bazel o conjunto de arquivos que você vai modificar. O Bazel só vai manter o estado necessário para reconstruir incrementalmente as mudanças nesses arquivos. Esse recurso é chamado de Skyfocus.

Para usar o Skyfocus, transmita a flag --experimental_enable_skyfocus:

bazel build //pkg:target --experimental_enable_skyfocus

Por padrão, o conjunto de trabalho será o conjunto de arquivos ao lado do destino que está sendo criado. No exemplo, todos os arquivos em //pkg serão mantidos no conjunto de trabalho, e as mudanças nos arquivos fora do conjunto de trabalho serão proibidas até que você emita bazel clean ou reinicie o servidor do Bazel.

Se você quiser especificar um conjunto exato de arquivos ou diretórios, use a flag --experimental_working_set, como esta:

bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir

Também é possível transmitir --experimental_skyfocus_dump_post_gc_stats para mostrar o valor da redução de memória:

Juntando tudo, o resultado será parecido com este:

$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions

Para este exemplo, o uso do Skyfocus permitiu que o Bazel descartasse 561 MB (45%) de memória, e os builds incrementais para processar mudanças em arquivos em dir1, dir2 e dir3/subdir vão manter as velocidades rápidas, com a desvantagem de que o Bazel não pode reconstruir arquivos alterados fora desses diretórios.

Criação de perfil de memória

O Bazel vem com um criador de perfil de memória integrado que pode ajudar você a verificar o uso de memória da regra. Leia mais sobre esse processo na seção Criação de perfil de memória da nossa documentação sobre como melhorar a performance de regras personalizadas.