优化内存

报告问题 查看来源 每晚 · 7.3。 · 7.2 条 · 7.1 · 7.0 · 6.5

本页介绍了如何限制和减少 Bazel 使用的内存。

在有限的 RAM 下运行 Bazel

在某些情况下,您可能希望 Bazel 使用最少的内存。您可以通过启动标志 --host_jvm_args(例如 --host_jvm_args=-Xmx2g)设置堆大小上限。

以增量构建速度换取内存

如果构建过大,Bazel 可能会在以下情况下抛出 OutOfMemoryError (OOM) 因为系统没有足够的内存您可以让 Bazel 使用的内存更少,代价是 增量构建速度变慢的场景,方法是传递以下命令标志: --discard_analysis_cache--nokeep_state_after_build, 和 --notrack_incremental_state

这些标志会尽可能减少 Bazel 在构建中使用的内存,但代价是 使未来的 build 比标准增量 build 慢。

您也可以单独传递以下任一标志:

  • --discard_analysis_cache 会减少执行期间使用的内存(不是 分析)。增量构建无需重做软件包加载,但会 必须重新进行分析和执行(尽管磁盘上的操作缓存可以 防止大多数重新执行)。
  • --notrack_incremental_state 不会在 Bazel 的内部 依赖关系图,因此它不能用于增量构建。下一个 build 会舍弃这些数据,但在此之前仍会保留这些数据,以便进行内部调试 除非指定了 --nokeep_state_after_build
  • --nokeep_state_after_build 会在 build 后舍弃所有数据,因此增量 build 必须从头开始构建(磁盘上的操作缓存除外)。仅这一项不会影响当前 build 的高水位标记。

使用 Skyfocus(实验性)以内存换取构建灵活性

如果您希望 Bazel 使用的内存更少并保持增量构建速度, 您可以告诉 Bazel 您要修改的工作文件集, Bazel 只会保留以正确的方式逐步重新构建更改所需的状态, 这些文件。此功能称为 Skyfocus

如需使用 Skyfocus,请传递 --experimental_enable_skyfocus 标志:

bazel build //pkg:target --experimental_enable_skyfocus

默认情况下,工作集是指 。在该示例中,//pkg 中的所有文件都将保留在工作集中,并且系统将禁止对工作集之外的文件进行更改,直到您发出 bazel clean 或重启 Bazel 服务器。

如果您要指定一组确切的文件或目录,请使用 --experimental_working_set 标志,如下所示:

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

您也可以传递 --experimental_skyfocus_dump_post_gc_stats 以显示 内存减少量:

总而言之,您应该会看到如下内容:

$ 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

在本示例中,使用 Skyfocus 使 Bazel 节省了 561MB (45%) 的内存, 和增量构建,用于处理对 dir1dir2dir3/subdir 将保持较快的速度,但 Bazel 无法进行权衡 在这些目录之外重新构建已更改的文件。

内存分析

Bazel 附带一个内置的内存分析器,可以帮助您检查规则的 内存用量。如需详细了解此流程,请访问 “内存分析”部分 有关如何提高自定义规则效果的文档。