इस पेज पर, Bazel के इस्तेमाल की जाने वाली मेमोरी को सीमित करने और कम करने का तरीका बताया गया है.
सीमित रैम वाले डिवाइस पर Bazel का इस्तेमाल करना
कुछ मामलों में, हो सकता है कि आपको Bazel को कम से कम मेमोरी का इस्तेमाल करने के लिए कहना हो. --host_jvm_args=-Xmx2g
जैसे स्टार्टअप फ़्लैग --host_jvm_args
की मदद से, ज़्यादा से ज़्यादा हेप सेट किया जा सकता है.
मेमोरी के लिए, इंक्रीमेंटल बिल्ड स्पीड को कम करना
अगर आपके बिल्ड बहुत बड़े हैं, तो हो सकता है कि Bazel के पास ज़रूरत के मुताबिक मेमोरी न होने पर, वह OutOfMemoryError
(ओवर ऑन मेमोरी) दिखाए. 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 का इस्तेमाल करने के लिए, --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 एमबी (45%) की मेमोरी कम करने की अनुमति मिली. साथ ही, dir1
, dir2
, और dir3/subdir
में मौजूद फ़ाइलों में हुए बदलावों को मैनेज करने के लिए, इंक्रीमेंटल बिल्ड की रफ़्तार पहले जैसी ही रहेगी. हालांकि, इन डायरेक्ट्री के बाहर मौजूद फ़ाइलों में हुए बदलावों को Bazel फिर से नहीं बना पाएगा.
मेमोरी प्रोफ़ाइलिंग
Bazel में पहले से मौजूद मेमोरी प्रोफ़ाइलर की मदद से, यह देखा जा सकता है कि आपके नियम में कितनी मेमोरी का इस्तेमाल हुआ है. कस्टम नियमों की परफ़ॉर्मेंस को बेहतर बनाने के तरीके के बारे में जानने के लिए, हमारे दस्तावेज़ के मेमोरी प्रोफ़ाइलिंग सेक्शन में इस प्रोसेस के बारे में ज़्यादा पढ़ें.