2011-08-30 19 views
17

var Obj = function(){}; var X = new Obj();जावास्क्रिप्ट में आप स्मृति को कैसे साफ़ करते हैं?

X = null मेमोरी ठीक से साफ़ करेगा?

यह भी समकक्ष होगा?

var Obj = function(){}; 
var X = {}; 
X.obj = new Obj(); 
delete(X.obj); 

संपादित यह प्रतीत होता है कि यद्यपि को हटाने X.obj नहीं तुरंत स्पष्ट स्मृति, यह कचरा संग्रहण में मदद करेगी। यदि मैं X.obj को नहीं हटाता, तो अभी भी किसी ऑब्जेक्ट के लिए पॉइंटर होगा और इसलिए जीसी इसे साफ़ नहीं कर सकता है।

हालांकि मैं @ डेलन के जवाब को चुन रहा हूं, अगर आप इसे पढ़ रहे हैं तो आपको बेनबर्ड के लेख को भी पकड़ना चाहिए।

मुझे यह भी पता है कि मैंने गलती से हटाए जाने के बजाय हटाए गए (एक्स) को हटा दिया है (एक्स .obj) - क्षमा करें।

+0

आप कारण है कि आप में "को मंजूरी दे दी स्मृति" रुचि रखते हैं की व्याख्या करनी चाहिए। क्या यह राम उपयोग को कम करने के लिए है? या सुरक्षा के लिए? या कुछ और कारण? –

+0

रैम उपयोग को कम करने के लिए/सुनिश्चित करें कि जीसी इसे –

+0

हिट करता है मुझे यह प्रश्न पसंद है। दुर्भाग्य से अधिकांश स्मृति प्रबंधित वातावरण के साथ जीसी को यह काम करने देना सबसे अच्छा तरीका है। ओह, और संदर्भों पर पकड़ पकड़ो। –

उत्तर

15

संक्षिप्त उत्तर है कि तुम नहीं है। delete बस एक संदर्भ हटा देता है (और जिस तरीके से आप इसे उपयोग करने का प्रयास नहीं करते हैं, ऊपर दिए गए लिंक को देखें - delete उन भाषा सुविधाओं में से एक है जो वास्तव में कुछ लोग समझते हैं), और कुछ भी नहीं। कार्यान्वयन आपके लिए स्मृति को साफ़ करता है, लेकिन यह आपका व्यवसाय नहीं है (और यहां तक ​​कि अगर सख्ती से बोल रहा है - यही कारण है कि किसी को जीसीडी भाषाओं में अंतिम रूप देने वालों पर भरोसा नहीं करना चाहिए) यह करता है। नोट हालांकि:

  • केवल ऑब्जेक्ट्स को सभी कोडों तक पहुंचने योग्य (यानी इसे एक्सेस करने का कोई तरीका नहीं) साबित किया जा सकता है। जो संदर्भ आमतौर पर स्पष्ट रूप से स्पष्ट रूप से स्पष्ट रूप से स्पष्ट है, के संदर्भ रखता है। बहुत सारे बंद होने से निपटने के दौरान आपको केवल बाहर देखने की ज़रूरत है, क्योंकि वे आपके विचार से अधिक चर पकड़ सकते हैं। यह भी ध्यान रखें कि परिपत्र संदर्भ ठीक से साफ हो गए हैं।
  • पुराने में एक बग है (लेकिन दुख की बात है अभी भी उपयोग की गई) आईई संस्करण जेएस इवेंट हैंडलर और डीओएम तत्वों के कचरा संग्रह शामिल हैं। Google (शायद यहां तक ​​कि एसओ) में मेरी याददाश्त पर बेहतर सामग्री होनी चाहिए।

प्लस साइड पर, इसका मतलब है कि आपको पॉइंटर बग्स (या उपरोक्त उपरोक्त त्रुटियों को बचाएं) मेमोरी लीक नहीं मिलेगा।

+0

तो उपरोक्त कोड उदाहरण में, ' नया ओबीजे() कचरा संग्रह के माध्यम से स्मृति से हटा दिया जा सकता है, क्योंकि अब कुछ भी इससे संकेत नहीं है? –

+0

पहले स्निपेट के बाद, बनाई गई ऑब्जेक्ट का संदर्भ नहीं दिया गया है और इस प्रकार इसे एकत्रित किया जा सकता है। दूसरा दुरुपयोग 'हटाएं' (बेनबर्ड का लिंक देखें) और परिणाम इस बात पर निर्भर करता है कि कार्यान्वयन आपको चर को हटाने देता है, लेकिन यदि ऐसा होता है, तो कोई संदर्भ शेष नहीं है। अन्यथा, जैसे ही 'एक्स' गुंजाइश से बाहर हो जाता है, वस्तुएं कचरा बन सकती हैं। किसी भी तरह से, किसी भी समय समय पर स्मृति को मुक्त किया जाता है * ऑब्जेक्ट अब पहुंचने योग्य नहीं होने के बाद * तुरंत (अविश्वसनीय मौका तक नहीं) के बाद। – delnan

+0

मैंने अभी देखा है कि मैंने अपने स्निपेट में एक टाइपो बनाया है। मेरा मतलब है हटाने (एक्स .obj)। तो क्या मुझे जीसी को गति देने के लिए हटाएं (एक्स.ओबीजे) या एक्स.ओबीजे = नल? –

3

नहीं - जावास्क्रिप्ट जीसी चलाता है जब ऐसा लगता है।

13

सं

इस पढ़ें:

http://perfectionkills.com/understanding-delete/

+0

इस के लिए धन्यवाद। – ZenMaster

+1

+1 महान लेख –

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। – Mistalis

2

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

जावास्क्रिप्ट का अपना जीसी है, और यह चीजों को चारों ओर चलाएगा और चीजों को साफ करेगा जब कुछ भी उन्हें संदर्भित नहीं करेगा।

मुझे अभी भी लगता है कि यह शून्य वस्तुओं के लिए एक अच्छा अभ्यास है। किसी ऑब्जेक्ट को हटाने से जीसी में भी मदद मिलती है क्योंकि यह कुछ खतरनाक दिखाई देगी, और कहें "मैं तुम्हें खाने जा रहा हूं क्योंकि आप अकेले हैं (और अब कुछ सनकी हंसी)"।

आप एक जीसी वहाँ हालांकि Deleting Objects in JavaScript

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

0

जावास्क्रिप्ट मेमोरी आम तौर पर जावा के समान ही संभाला जाता है - मेरा मतलब है कि एक कचरा कलेक्टर है (या वहां होना चाहिए) यदि ऑब्जेक्ट को हटाया जाए तो इसका कोई संदर्भ नहीं है। तो हां, संदर्भ को केवल "शून्य" करने का एकमात्र तरीका है जिसे आपको "मुक्त" स्मृति को संभालना चाहिए, और असली मुफ़्त जेएस होस्ट भाग है।

1

आम तौर पर, जावास्क्रिप्ट में मेमोरी प्रबंधन उपयोगकर्ता-एजेंट-विशिष्ट है। कचरा कलेक्टर की मूल बातें संदर्भ-गिनती के माध्यम से हैं। तो, शून्य के संदर्भ को सेट करके (delete कीवर्ड या स्पष्ट असाइनमेंट द्वारा), आप स्वयं को आश्वस्त कर सकते हैं कि एक संदर्भ साफ हो जाएगा, IF ऑब्जेक्ट में कोई संदर्भ नहीं है जो इसके निर्माण के दायरे से बाहर रहेगा। इस मामले में, जीसी पहले से ही किसी ऑब्जेक्ट्स या वैरिएबल को साफ़ कर देगी जिसका जिसका दायरा स्पष्ट रूप से इसे शून्य पर सेट किए बिना समाप्त हो गया है।

देखभाल करने के लिए कुछ चीजें हैं, हालांकि - जेएस में सर्कुलर संदर्भ बनाना आसान है, खासकर डीओएम तत्व और ऑब्जेक्ट के बीच। वस्तुओं के भीतर और/या डीओएम तत्वों से संदर्भ (या पहले स्थान पर नहीं) संदर्भों को ध्यान में रखना चाहिए। यदि आप डीओएम से संबंधित संदर्भ में/से बनाते हैं, तो सुनिश्चित करें कि संदर्भों को शून्य पर संदर्भों को सेट करके स्पष्ट करें - दोनों अपनी ऑब्जेक्ट पर और DOM तत्व पर। बस माता-पिता ऑब्जेक्ट को शून्य पर सेट करना पर्याप्त नहीं है यदि डीओएम या लोकल स्टोरेज से संदर्भ के साथ बाल ऑब्जेक्ट्स हैं क्योंकि उन संदर्भों पर लाइव रहेगा, और यदि बच्चे से माता-पिता को कोई संदर्भ दिया गया था, तो माता-पिता इसमें रहेंगे उस संदर्भ के कारण स्मृति।

वेब पेज वास्तव में आपकी स्मृति में कचरे को रिसाव कर सकते हैं - जब आप नेविगेट करने के बाद, परिपत्र संदर्भ ऑब्जेक्ट्स और डोम तत्वों को स्मृति में तब तक रखें जब तक आप ब्राउज़र को पुनरारंभ नहीं करते!

विषय पर एक लेख: http://docstore.mik.ua/orelly/webprog/jscript/ch11_03.htm, और एक अन्य विस्तृत जानकारी: http://blogs.msdn.com/b/ericlippert/archive/2003/09/17/53038.aspx

संबंधित मुद्दे