मेमोरी लीक कैसे खोजें, इसके बारे में कुछ लेख हैं।
लेकिन एक बनाने के बारे में कैसे?
मुझे लगता है कि यह एक दिलचस्प अभ्यास होगा ताकि आप जान सकें कि रूबी में स्मृति रिसाव कैसा दिखता है।
आइए कुछ उदाहरण देखें।
एक साधारण रिसाव
हम केवल एक सरणी में नई वस्तुओं को जोड़कर स्मृति रिसाव बना सकते हैं।
इसे पसंद करें :
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
गिनती बढ़ती रहती है क्योंकि जीसी इन तारों को एकत्र नहीं कर सकता है, उन्हें युक्त सरणी द्वारा संदर्भित किया जा रहा है (a
)।
अगर a
दायरे से बाहर हो जाता है जो जीसी को इन सभी "abc"
. को एकत्रित करने की अनुमति देगा तार। आप a
. सेट करके ऊपर दिए गए उदाहरण से इसका परीक्षण कर सकते हैं शून्य करने के लिए, फिर चल रहा है GC.start
।
आप यहां एक जीवंत उदाहरण पा सकते हैं, बस run
. पर क्लिक करें परिणाम देखने के लिए।
सी एक्सटेंशन लीक
जब आप रूबी से कोई ऑब्जेक्ट बनाते हैं तो जीसी ट्रैक करता है कि वह कितनी मेमोरी का उपयोग कर रहा है, लेकिन सी एक्सटेंशन का उपयोग करते समय रूबी का इस पर कोई नियंत्रण नहीं है कि क्या होता है।
अगर आप इस तरह 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 में एक ज्ञात स्मृति रिसाव है, इसलिए यदि आप इस विशिष्ट संस्करण का उपयोग कर रहे हैं तो आप अपग्रेड करना चाहेंगे।
क्या आपके पास कोई प्रश्न, प्रतिक्रिया या एक दिलचस्प मेमोरी लीक डिबगिंग कहानी है? नीचे एक टिप्पणी छोड़ें 🙂
पढ़ने के लिए धन्यवाद!