最佳化記憶體

回報問題 查看來源 夜間 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 在建構中使用的記憶體,而且不會耗用大量資源 導致日後建構作業的速度比標準漸進式建構作業慢

您也可以個別傳遞以下其中一個標記:

  • --discard_analysis_cache 會減少執行期間使用的記憶體 (而非 分析)。漸進式建構作業不必重新載入套件,但會 必須重新執行分析和執行作業 (不過磁碟上的動作快取 以防止極度重新執行)。
  • --notrack_incremental_state 不會在 Bazel 的內部儲存空間中儲存任何邊緣 依附元件圖表,因此無法用於漸進式建構。下一個版本 就會捨棄資料,但為了內部偵錯 除非指定 --nokeep_state_after_build
  • --nokeep_state_after_build 會在建構完成後捨棄所有資料, 漸進式建構作業必須從頭開始建立 (磁碟上動作除外) 快取)。這不會影響目前版本的高水標記。

使用天空對焦功能交換記憶體的彈性 (實驗功能)

如要減少 Bazel 使用的記憶體,「同時」保留漸進式建構速度: 您可以告訴 Bazel 您想修改的工作組檔案, Bazel 只會保留必要的狀態,以便能正確逐步重新建構變更, 這些檔案這項功能稱為「天空對焦」。

如要使用天空對焦,請傳遞 --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 可以捨棄 561 MB (45%) 的記憶體 和漸進式版本來處理 dir1dir2dir3/subdir 會保留快速速度,但 Bazel 無法權衡 重新建立這些目錄外的變更檔案。

記憶體分析

Bazel 內建的記憶體分析器可協助您檢查規則的 記憶體用量如要進一步瞭解這項程序,請前往 「記憶體分析」一節 。