गारबेज कलेक्टर (जीसी) PHP में आंतरिक मेमोरी प्रबंधन प्रणाली है, लेकिन समझने के लिए कुछ सूक्ष्मताएं हैं।
जीसी मेमोरी प्रबंधन को स्वचालित करता है, जो मैन्युअल कार्यों (जो कठिन होगा) के साथ मेमोरी को संभालने की परेशानी को दूर करता है।
यह डेवलपर्स को 'आउट ऑफ मेमोरी' त्रुटियों के बारे में अत्यधिक चिंता किए बिना अपने व्यावसायिक तर्क पर ध्यान केंद्रित करने की अनुमति देता है।
बेशक, यह जादू नहीं है।
जिन वस्तुओं की अब आवश्यकता नहीं है उन्हें मुक्त करना मेमोरी लीक को रोकता है।
जीसी गिराए जाने वाले तत्वों को निर्धारित करने के लिए एक गिनती तंत्र का उपयोग करता है। यदि कोई संदर्भ किसी विशेष वस्तु की ओर इशारा नहीं करता है (अर्थात, $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 अन्य भाषाओं से कैसे भिन्न है।
अधिकांश समय, अन्य भाषाएं कचरा इकट्ठा करने के लिए संदर्भ गणना पर निर्भर नहीं होती हैं या विभिन्न कार्यान्वयन का उपयोग कर सकती हैं।
उदाहरण के लिए, कई लोग ट्रेसिंग एल्गोरिदम का उपयोग करते हैं जो अप्रयुक्त वस्तुओं को भी चिह्नित करता है लेकिन वृद्धिशील रूप से काम नहीं करता है। यह एक ग्राफ़ ट्रैवर्सल है।
इसके अलावा, कुछ भाषाएं इस तरह के प्रत्यक्ष नियंत्रण की अनुमति नहीं देती हैं (उदाहरण के लिए, रनटाइम पर चालू/बंद)।
हमेशा की तरह, कुछ फायदे और असुविधाएं हैं, इसलिए आप कुछ मिश्रित दृष्टिकोण देख सकते हैं।
आप अंतर्निहित gc_* सहायकों का लाभ उठा सकते हैं।
उदाहरण के लिए:
ये फ़ंक्शन डिबगिंग या कचरा संग्रहण को ठीक करने के लिए सहायक होते हैं जब आवश्यक हो।
अधिक जानकारी के लिए आप यह पोस्ट पढ़ सकते हैं:
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
अधिकांश उपयोगों के लिए, आपको मेमोरी प्रबंधन के बारे में चिंता करने की ज़रूरत नहीं होगी, क्योंकि PHP पहले से ही इसे संभालती है।
हालाँकि, क्योंकि आधुनिक स्टैक लंबे समय तक जीवित रहने वाली वस्तुओं का उपयोग करते हैं, इसलिए आपको संभावित मेमोरी लीक के लिए अपने एप्लिकेशन की निगरानी करने की आवश्यकता है।
यदि आपको समस्याएं आती हैं, तो आपको कोड को अनुकूलित करना होगा और/या सीधे जीसी के साथ बातचीत करनी होगी।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3