मेमोरी लीक कैसे खोजें, इस पर कुछ लेख मौजूद हैं।
लेकिन एक बनाने के बारे में क्या?
मुझे लगता है कि यह एक दिलचस्प अभ्यास होगा ताकि आप जान सकें कि रूबी में मेमोरी लीक कैसी दिखती है।
आइए कुछ उदाहरण देखें।
एक सरल लीक
हम बस एक सरणी में नए ऑब्जेक्ट्स जोड़कर मेमोरी लीक बना सकते हैं।
इस तरह:
a = [] b = {} loop { sleep(1) 10_000.times { a << "abc" } puts GC.stat(b)[:heap_live_slots] } यह हर सेकंड 10k स्ट्रिंग्स बनाता है और एक ऑब्जेक्ट काउंट प्रिंट करता है:
285051 295052 305053 315054 325055 335056 345057 355058
काउंट बढ़ता रहता है क्योंकि GC इन स्ट्रिंग्स को इकट्ठा नहीं कर सकता, उन्हें समाहित करने वाली सरणी (a) द्वारा संदर्भित किया जा रहा है।
यदि a स्कोप से बाहर चला जाता है तो यह GC को इन सभी "abc" स्ट्रिंग्स को इकट्ठा करने की अनुमति देगा। आप इसे ऊपर दिए गए उदाहरण के साथ a को nil पर सेट करके, फिर GC.start चलाकर टेस्ट कर सकते हैं।
आप यहां एक लाइव उदाहरण पा सकते हैं, परिणाम देखने के लिए बस run पर क्लिक करें।
C एक्सटेंशन लीक
जब आप रूबी से एक ऑब्जेक्ट बनाते हैं तो GC ट्रैक करता है कि यह कितनी मेमोरी उपयोग कर रहा है, लेकिन C एक्सटेंशन का उपयोग करते समय रूबी का इस पर कोई नियंत्रण नहीं होता कि क्या होता है।
यदि आप इस तरह एक C एक्सटेंशन बनाते हैं:
#include <ruby.h> #include "extconf.h" void *ptr; void Init_extension() { allocate_memory(); } void allocate_memory() { for(int i = 0; i < 10000; i++) { ptr = malloc(1000); } } allocate_memory() फंक्शन मेमोरी लीक करेगा क्योंकि यह malloc का उपयोग कर रहा है और उस मेमोरी को जारी करने के लिए free को कॉल नहीं करता।
जैसा कि आप यहां देख सकते हैं:
`ps -o rss -p #{$$}`.lines.last # "49036" require './extension' `ps -o rss -p #{$$}`.lines.last # "89512" इस तरह का लीक किसी भी हीप डंप या GC.stat पर दिखाई नहीं देगा, लेकिन आप मेमोरी उपयोग बढ़ते हुए देखेंगे।
सारांश
अब आप जानते हैं कि मेमोरी लीक कैसी दिखती है, उम्मीद है कि अगर आपको कभी यह समस्या हो तो यह आपको तेजी से खोजने में मदद करेगा। वैसे रूबी 2.4.1 में एक ज्ञात मेमोरी लीक है, इसलिए यदि आप इस विशिष्ट संस्करण का उपयोग कर रहे हैं तो आप अपग्रेड करना चाह सकते हैं।
क्या आपके कोई प्रश्न, फीडबैक या दिलचस्प मेमोरी लीक डीबगिंग कहानी है? नीचे कमेंट छोड़ें 🙂
पढ़ने के लिए धन्यवाद!