"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > PHP: कचरा संग्रहकर्ता ने सरल शब्दों में समझाया

PHP: कचरा संग्रहकर्ता ने सरल शब्दों में समझाया

2024-12-11 को प्रकाशित
ब्राउज़ करें:876

गारबेज कलेक्टर (जीसी) PHP में आंतरिक मेमोरी प्रबंधन प्रणाली है, लेकिन समझने के लिए कुछ सूक्ष्मताएं हैं।

? जीसी अस्तित्व में क्यों है?

जीसी मेमोरी प्रबंधन को स्वचालित करता है, जो मैन्युअल कार्यों (जो कठिन होगा) के साथ मेमोरी को संभालने की परेशानी को दूर करता है।

यह डेवलपर्स को 'आउट ऑफ मेमोरी' त्रुटियों के बारे में अत्यधिक चिंता किए बिना अपने व्यावसायिक तर्क पर ध्यान केंद्रित करने की अनुमति देता है।

बेशक, यह जादू नहीं है।

? संक्षेप में 10,000 वस्तुएँ

जिन वस्तुओं की अब आवश्यकता नहीं है उन्हें मुक्त करना मेमोरी लीक को रोकता है

जीसी गिराए जाने वाले तत्वों को निर्धारित करने के लिए एक गिनती तंत्र का उपयोग करता है। यदि कोई संदर्भ किसी विशेष वस्तु की ओर इशारा नहीं करता है (अर्थात, $counter = 0), तो यह वस्तु सफ़ाई के लिए योग्य है।

यह बहुत अच्छी तरह से काम करता है, लेकिन कुछ संदर्भ समस्याग्रस्त हो सकते हैं:

class A {
    public $b;
}

class B {
    public $a;
}

$a = new A();
$b = new B();

$a->b = $b;
$b->a = $a;

unset($a);
unset($b);

खराब डिज़ाइन के इस मामले में, PHP मेमोरी को खाली नहीं करेगा, भले ही हम $a और $b को अनसेट कर दें, क्योंकि वे एक-दूसरे को संदर्भित करते हैं, जिससे PHP को विश्वास हो जाता है कि वे अभी भी उपयोग में हैं।

सौभाग्य से, इसके लिए साइकिल कलेक्टर नामक एक और तंत्र है:

gc_collect_cycles();

मोटे तौर पर कहें तो, कलेक्टर सभी संदर्भों को पार करता है और उपयोग में आने वाली वस्तुओं को चिह्नित करने के लिए एक एल्गोरिदम लागू करता है, जो एकत्रित करने के लिए वस्तुओं (अचिह्नित वस्तुओं) को प्रकट करता है।

हालाँकि, PHP स्वचालित चक्र संग्रह को ट्रिगर नहीं करता है जब तक कि संभावित चक्रीय संदर्भों के साथ 10,000 ऑब्जेक्ट्स की सीमा तक नहीं पहुँच जाता है।

फिर, यह जादू नहीं है, इसलिए आपको केवल कुछ मामलों में gc_collect_cycles() को लागू करना होगा।

? टैनस्टाफ़ल

खराब डिज़ाइन वस्तुओं के बीच अत्यधिक जटिल संबंधों को जन्म दे सकता है, जिससे अधिक संदर्भ और अधिक बार कचरा संग्रहण हो सकता है।

प्रत्येक संदर्भ-गणित वस्तु को उसकी संदर्भ गणना के लिए अतिरिक्त भंडारण की आवश्यकता होती है।

स्रोत: विकिपीडिया - संदर्भ गणना

मेमोरी क्लीनअप ऑपरेशन से जुड़ा ओवरहेड वैश्विक प्रदर्शन को महत्वपूर्ण रूप से प्रभावित कर सकता है और अंततः विशिष्ट परिदृश्यों में निष्पादन समय बढ़ा सकता है।

10 साल पहले, केवल gc_disable() फ़ंक्शन का उपयोग करके संगीतकार को जबरदस्त प्रदर्शन बढ़ावा मिला था।

स्रोत: संगीतकार - जीसी को अक्षम करना

वास्तव में, PHP 7 ने GC में काफी सुधार किया है, इसलिए यह वैसा नहीं है जैसा 2014 में था।

इसके अलावा, PHP 8 संस्करणों ने मेमोरी आवंटन रणनीतियों में सुधार किया और बेहतर निगरानी के लिए GC संचालन के बारे में अधिक उपयोगी आंकड़े जोड़े (8.3 में gc_status())।

अधिकांश PHP एप्लिकेशन अनुरोध-संचालित होते हैं, और अनुरोध के अंत में मेमोरी स्वचालित रूप से साफ़ हो जाती है।

फिर, यह बहुत अच्छा है लेकिन जादू नहीं है। अतुल्यकालिक अनुरोधों और लंबे समय तक रहने वाली वस्तुओं/डेमॉन के साथ क्या होता है?

आपको किसी बिंदु पर मेमोरी लीक का अनुभव हो सकता है।

? PHP की GC कितनी भिन्न है?

इस बिंदु पर, आप यह नहीं देख पाएंगे कि PHP की GC अन्य भाषाओं से कैसे भिन्न है।

अधिकांश समय, अन्य भाषाएं कचरा इकट्ठा करने के लिए संदर्भ गणना पर निर्भर नहीं होती हैं या विभिन्न कार्यान्वयन का उपयोग कर सकती हैं।

उदाहरण के लिए, कई लोग ट्रेसिंग एल्गोरिदम का उपयोग करते हैं जो अप्रयुक्त वस्तुओं को भी चिह्नित करता है लेकिन वृद्धिशील रूप से काम नहीं करता है। यह एक ग्राफ़ ट्रैवर्सल है।

इसके अलावा, कुछ भाषाएं इस तरह के प्रत्यक्ष नियंत्रण की अनुमति नहीं देती हैं (उदाहरण के लिए, रनटाइम पर चालू/बंद)।

हमेशा की तरह, कुछ फायदे और असुविधाएं हैं, इसलिए आप कुछ मिश्रित दृष्टिकोण देख सकते हैं।

?‍? PHP के GC के साथ इंटरैक्ट करना

आप अंतर्निहित gc_* सहायकों का लाभ उठा सकते हैं।

उदाहरण के लिए:

  • gc_collect_cycles कचरा संग्रहण को मैन्युअल रूप से ट्रिगर करता है
  • gc_status() वर्तमान स्थिति बताएं
  • gc_disable() इसे अक्षम कर देता है
  • gc_enable() इसे सक्षम बनाता है

ये फ़ंक्शन डिबगिंग या कचरा संग्रहण को ठीक करने के लिए सहायक होते हैं जब आवश्यक हो

? स्मृति त्रुटियों को समझना

अधिक जानकारी के लिए आप यह पोस्ट पढ़ सकते हैं:

PHP: The Garbage Collector explained with simple words

PHP: मेमोरी त्रुटियां

spO0q ? ・ 24 मई '23

#php #शुरुआती #प्रोग्रामिंग

? बचाव के लिए कमजोर मानचित्र?

PHP 7.4 ने कमजोर संदर्भ पेश किए और PHP 8 ने कमजोर मानचित्र पेश किए।

एक कमजोर मानचित्र को कमजोर संदर्भों के संग्रह के रूप में वर्णित किया जा सकता है।

यह डेटा संरचना एक बहुमुखी कुंजी-मूल्य स्टोर है जो PHP को अव्यवस्था पैदा किए बिना या अत्यधिक स्थान का उपभोग किए बिना वस्तुओं पर नज़र रखने में मदद करती है।

आप इसे एक अस्थायी भंडारण के रूप में देख सकते हैं जिसे आवश्यकता न होने पर तुरंत साफ़ कर दिया जाएगा, क्योंकि ऐसा कोई [मजबूत] संदर्भ नहीं है जो कचरा संग्रहण को रोक सके:

$object = new stdClass;
$map = new WeakMap();
$map[$object] = true;
$object->name = 'some name';
print_r($map);// $object is stored in $map

unset($object);

print_r($map);// $object is cleaned and no longer available

✅ पेशेवरों

  • बहुत सीधा-सादा
  • कैशिंग या मेमोइज़ेशन के लिए बढ़िया (उदाहरण के लिए, महंगी गणना)

❌ विपक्ष

  • जबकि कुंजियाँ (ऑब्जेक्ट्स) कचरा संग्रहण को नहीं रोकती हैं, मान कर सकते हैं, इसलिए "मनमाना मान" शब्द भ्रामक हो सकता है (मूल्यों के रूप में केवल सरल डेटा प्रकारों का उपयोग करें)
  • मूल्यवान उपयोग के मामले सीमित हैं

? कोड को अनुकूलित करें

  • अंतरनिर्भरता को कम करने वाले डिज़ाइन पैटर्न का लाभ उठाएं
  • निर्भरता इंजेक्शन का उपयोग करें
  • मेमोरी में बहुत बड़े डेटासेट लोड न करें और विशाल सरणियों के बजाय संग्रह और जनरेटर का उपयोग करें
  • मेमोरी उपयोग की निगरानी करें
  • मेट्रिक्स के साथ अपना कोड प्रोफाइल करें
  • gc_enable(), gc_disable(), और gc_collect_cycles() का संयम से उपयोग करें

लपेटें

अधिकांश उपयोगों के लिए, आपको मेमोरी प्रबंधन के बारे में चिंता करने की ज़रूरत नहीं होगी, क्योंकि PHP पहले से ही इसे संभालती है।

हालाँकि, क्योंकि आधुनिक स्टैक लंबे समय तक जीवित रहने वाली वस्तुओं का उपयोग करते हैं, इसलिए आपको संभावित मेमोरी लीक के लिए अपने एप्लिकेशन की निगरानी करने की आवश्यकता है।

यदि आपको समस्याएं आती हैं, तो आपको कोड को अनुकूलित करना होगा और/या सीधे जीसी के साथ बातचीत करनी होगी।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/spo0q/php-the-garbage-collector-explained-with-simple-words-1b7d?1 यदि कोई उल्लंघन है, तो हटाने के लिए कृपया [email protected] से संपर्क करें यह
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3