本页面介绍了如何限制和减少 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 在构建中使用的内存,但代价是 未来的构建速度会比标准增量构建慢。
您还可以单独传递其中任何一个标志:
--discard_analysis_cache将减少执行期间(而非 分析期间)使用的内存。增量构建无需重新执行软件包加载,但必须 重新执行分析和执行(不过,磁盘上的操作缓存可以 防止大多数重新执行)。--notrack_incremental_state不会在 Bazel 的内部 依赖关系图中存储任何边,因此无法用于增量构建。下一次构建 将舍弃该数据,但除非指定了--nokeep_state_after_build,否则该数据会保留到那时以进行内部调试。--nokeep_state_after_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%) 的内存,
并且增量构建能够处理对 dir1、dir2 和
dir3/subdir 下文件的更改,同时保持快速速度,但代价是 Bazel 无法
重建这些目录之外的已更改文件。
内存分析
Bazel 附带内置的内存分析器,可帮助您检查规则的 内存使用情况。如需详细了解此过程,请参阅有关如何提高自定义规则性能的 文档的 内存分析部分。