Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में मेमोरी लीक कैसे बनाएं?

मेमोरी लीक कैसे खोजें, इसके बारे में कुछ लेख हैं।

लेकिन एक बनाने के बारे में कैसे?

मुझे लगता है कि यह एक दिलचस्प अभ्यास होगा ताकि आप जान सकें कि रूबी में स्मृति रिसाव कैसा दिखता है।

आइए कुछ उदाहरण देखें।

एक साधारण रिसाव

हम केवल एक सरणी में नई वस्तुओं को जोड़कर स्मृति रिसाव बना सकते हैं।

इसे पसंद करें :

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 में एक ज्ञात स्मृति रिसाव है, इसलिए यदि आप इस विशिष्ट संस्करण का उपयोग कर रहे हैं तो आप अपग्रेड करना चाहेंगे।

क्या आपके पास कोई प्रश्न, प्रतिक्रिया या एक दिलचस्प मेमोरी लीक डिबगिंग कहानी है? नीचे एक टिप्पणी छोड़ें 🙂

पढ़ने के लिए धन्यवाद!


  1. रूबी में स्ट्रक्चर और ओपनस्ट्रक्चर का उपयोग कैसे करें?

    रूबी में स्ट्रक्चर क्या है? एक संरचना एक अंतर्निहित रूबी वर्ग है, इसका उपयोग नए वर्ग बनाने के लिए किया जाता है जो मूल्य वस्तुओं का उत्पादन करते हैं। संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए एक मूल्य वस्तु का उपयोग किया जाता है। यहां एक उदाहरण दिया गया है : एक Point दो निर्देशांकों के साथ

  1. Google Chrome मेमोरी उपयोग/मेमोरी लीक समस्याएं?

    मुझे इंटरनेट ब्राउज़ करने के लिए Google Chrome का उपयोग करना पसंद है और इसका एक मुख्य कारण हमेशा से रहा है क्योंकि यह बहुत तेज़ है! मुझे सभी ऐड-ऑन के साथ फ़ायरफ़ॉक्स का ब्लोट कभी पसंद नहीं आया और इंटरनेट एक्सप्लोरर बिल्कुल धीमा है। माइक्रोसॉफ्ट एज आईई की तुलना में काफी तेज है, लेकिन मैं इतनी सारी अ

  1. विंडोज 11 पर फाइल एक्सप्लोरर मेमोरी लीक को कैसे ठीक करें

    अपने डिवाइस को विंडोज 11 में अपग्रेड किया? ठीक है, अगर आप हाल ही में विंडोज 11 में मेमोरी लीक का अनुभव कर रहे हैं, तो हमारे पास आपके लिए कुछ उपयोगी समाधान हो सकते हैं! कई उपयोगकर्ताओं ने शिकायत की है कि वे विंडोज 11 में अपग्रेड करने के बाद मेमोरी लीक की समस्या से जूझ रहे हैं। विंडोज पर मेमोरी लीक तब