最佳化記憶體

回報問題 查看來源 Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

本頁面說明如何限制及減少 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 可減少 561 MB (45%) 的記憶體用量,且處理 dir1dir2dir3/subdir 下檔案變更的增量建構作業仍可維持快速速度,但缺點是 Bazel 無法重建這些目錄以外的變更檔案。

記憶體用量分析

Bazel 內建記憶體分析器,可協助您檢查規則的記憶體用量。如要進一步瞭解這個程序,請參閱說明文件中記憶體剖析部分,瞭解如何提升自訂規則的效能。