本頁面說明如何限制及減少 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 內建記憶體分析器,可協助您檢查規則的記憶體用量。如要進一步瞭解這項程序,請參閱說明文件的「記憶體分析」部分,瞭解如何提升自訂規則的成效。