本頁面說明如何限制及減少 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%) 的記憶體
和漸進式版本來處理 dir1
、dir2
和
dir3/subdir
會保留快速速度,但 Bazel 無法權衡
重新建立這些目錄外的變更檔案。
記憶體分析
Bazel 內建的記憶體分析器可協助您檢查規則的 記憶體用量如要進一步瞭解這項程序,請前往 「記憶體分析」一節 。