Halaman ini menjelaskan cara membatasi dan mengurangi memori yang digunakan Bazel.
Menjalankan Bazel dengan RAM Terbatas
Dalam situasi tertentu, Anda mungkin ingin Bazel menggunakan memori minimal. Anda dapat menyetel
heap maksimum melalui flag startup
--host_jvm_args
,
seperti --host_jvm_args=-Xmx2g
.
Bertukar kecepatan build inkremental untuk memori
Jika build terlalu besar, Bazel dapat menampilkan OutOfMemoryError
(OOM) saat
tidak memiliki cukup
memori. Anda dapat membuat Bazel menggunakan lebih sedikit memori, dengan biaya
build inkremental yang lebih lambat, dengan meneruskan flag perintah berikut:
--discard_analysis_cache
,
--nokeep_state_after_build
,
dan
--notrack_incremental_state
.
Flag ini akan meminimalkan memori yang digunakan Bazel dalam build, dengan mengorbankan membuat build mendatang lebih lambat dari build inkremental standar.
Anda juga dapat meneruskan salah satu tanda ini secara terpisah:
--discard_analysis_cache
akan mengurangi memori yang digunakan selama eksekusi (bukan analisis data). Build inkremental tidak harus mengulangi pemuatan paket, tetapi harus mengulangi analisis dan eksekusi (meskipun {i>cache<i} tindakan pada {i>on-disk<i} dapat mencegah sebagian besar eksekusi ulang).--notrack_incremental_state
tidak akan menyimpan tepi apa pun di bagian internal Bazel grafik dependensi, sehingga tidak dapat digunakan untuk build inkremental. Build berikutnya akan membuang data tersebut, namun data itu dipertahankan sampai saat itu, untuk {i>debugging<i} internal, kecuali jika--nokeep_state_after_build
ditentukan.--nokeep_state_after_build
akan menghapus semua data setelah build, sehingga build inkremental harus dibuat dari awal (kecuali untuk cache tindakan di disk). Sendiri, hal ini tidak memengaruhi level air tinggi dari build saat ini.
Tukar fleksibilitas build untuk memori dengan Skyfocus (Eksperimental)
Jika Anda ingin Bazel menggunakan lebih sedikit memori dan mempertahankan kecepatan build inkremental, Anda dapat memberi tahu Bazel mengenai {i>workdataset<i} yang akan Anda modifikasi, dan Bazel hanya akan mempertahankan status yang diperlukan untuk membangun kembali perubahan secara file tersebut. Fitur ini disebut Skyfocus.
Untuk menggunakan Skyfocus, teruskan flag --experimental_enable_skyfocus
:
bazel build //pkg:target --experimental_enable_skyfocus
Secara {i>default<i}, {i>working set<i} akan menjadi
kumpulan file di sebelah target yang
dibuat. Dalam contoh, semua file di //pkg
akan disimpan dalam set kerja, dan
perubahan pada file di luar set kerja tidak akan diizinkan, hingga Anda mengeluarkan
bazel clean
atau memulai ulang server Bazel.
Jika Anda ingin menentukan kumpulan file atau direktori yang tepat, gunakan metode
--experimental_working_set
, seperti berikut:
bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir
Anda juga dapat meneruskan --experimental_skyfocus_dump_post_gc_stats
untuk menampilkan
jumlah pengurangan memori:
Dengan menggabungkan semuanya, Anda akan melihat tampilan seperti ini:
$ 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
Untuk contoh ini, penggunaan Skyfocus memungkinkan
Bazel untuk mengurangi 561MB (45%) memori,
dan build inkremental untuk menangani perubahan pada file di bawah dir1
, dir2
, dan
dir3/subdir
akan mempertahankan kecepatannya yang cepat, tetapi Bazel tidak bisa
membangun ulang file yang
diubah di luar direktori ini.
Profiling Memori
Bazel dilengkapi dengan profiler memori bawaan yang dapat membantu Anda memeriksa penggunaan memori. Baca selengkapnya tentang proses ini di Bagian Memory Profiling dalam dokumentasi tentang cara meningkatkan performa aturan kustom.