32

मेरे पास Google क्रोम (संस्करण 20.0.1132.47, उबंटू 11.04 64 बिट) में कचरा-संग्रहण के बारे में कोई प्रश्न है।'bound_this' द्वारा संदर्भित उदाहरण केवल कचरा नहीं हैं

ढेर-डंप की तुलना करते हुए और स्मृति-रिसाव की जांच करते समय, मैंने कुछ उदाहरण खोजे, जिन्हें कभी साफ नहीं किया जाता है। आम तौर पर यह व्यवहार एक प्रोग्रामर त्रुटि के लिए नीचे नज़र रखी जा सकता है, लेकिन इस मामले में मैं नहीं बल्कि पता कर रहा हूँ ..

निम्नलिखित स्क्रीनशॉट Screenshot of heap-dump showing an instance (child) referenced only by 'bound_this'

उदाहरण 'बच्चे @ 610,739' संदर्भित है पर एक नजर डालें केवल 'bound_this' उदाहरणों से जो बच्चे के उदाहरण के कार्यों से संबंधित हैं। तो मेरी समझ के लिए, बच्चे के उदाहरण को कचरा इकट्ठा किया जाना चाहिए, क्योंकि इसका एकमात्र अन्य संदर्भ इसे पकड़ना है, उदाहरण के लिए बच्चे-उदाहरण ('bound_this' कार्यों के माध्यम से)।

मैं Underscore.js '' bindAll 'उपयोगिता समारोह (underscore.js#bindAll) कि क्रोम की' native_bind 'कार्य करने के लिए नक्शे का उपयोग कर रहा (ECMA Script wiki on bound_this)

मैं कुछ यहाँ स्पष्ट और यदि ऐसा है तो याद आ रही हूँ, किसी को समझा सकता है इन उदाहरणों को जिंदा क्या रख रहा है?

अद्यतन:
इस बीच मैं chrominium में एक ही आवेदन का परीक्षण किया (18.0.1025.168 (डेवलपर बिल्ड 134,367 लिनक्स) उबंटू 11.10) जो इन झूलते उदाहरणों प्रदर्शित नहीं करता है ..

अद्यतन 2 में:
के बाद Esailijas संकेत एक jsfiddle स्निपेट प्रदान करने के लिए, मैंने एक (http://jsfiddle.net/8gSTR/1/) बनाया है जो कि मूल रूप से मैं क्या कर रहा हूं नकल करता हूं। दुर्भाग्यवश इस पहेली को चलाने से मैं अपने आवेदन में अनुभव कर रहा दुर्व्यवहार नहीं दिखाता हूं। एक ढेर-डंप जबकि 'A'-उदाहरणों अभी भी संदर्भित लिया जो उदाहरणों जिंदा रहता है window.o सरणी से संदर्भ के बावजूद समान की तरह लग रहा है, हालांकि: Heap-dump taken during execution of jsfiddle mentioned above

इस तरह के एक संदर्भ के रूप में मेरे मामले में याद आ रही है (स्क्रीनशॉट 1) मुझे नहीं पता कि क्रोम इन उदाहरणों को मुक्त करने से क्या रोकता है ...

अद्यतन 3:
छुपा गुणों को सक्षम करने के लिए निम्नलिखित loislos सलाह का पालन किया। परिणाम (शाखाओं में से एक के विस्तार के साथ) निम्नलिखित स्क्रीनशॉट में देखा जा सकता है लेकिन यह मुझे और नहीं लेता है। Heap-dump with hidden properties enabled

+0

इसे यहां नहीं देख रहा है http://jsfiddle.net/uGX22/3/। शुरुआत में वे वहां हैं (ढेर 17 लेते हैं।60000 बंद के साथ 32 एमबी), मैं कुछ मिनट इंतजार करता हूं और एक नया स्नैपशॉट लेता हूं और ढेर 6 एमबी पर वापस आ जाता है और बंद हो जाता है। क्या आप इसे पुन: पेश करने के लिए अपने jsfiddle को संशोधित कर सकते हैं? – Esailija

+0

क्या आप हमें वह कोड दिखा सकते हैं जिसके साथ आपने यह स्थिति बनाई है? मैं वास्तव में इसे डीबगर के स्क्रीनशॉट से नहीं प्राप्त करता हूं। – Bergi

+0

मैं इस मुद्दे को पुन: पेश करने के लिए थोड़ा स्निपेट बनाने का प्रयास करूंगा। जिस कोड के साथ मैंने स्थिति बनाई है वह काफी बड़े एसपीए का हिस्सा है, इसलिए निकालना इतना आसान नहीं है। –

उत्तर

3

आपके संदेह कि यह वास्तविक स्मृति रिसाव नहीं है लेकिन क्रोम के साथ अजीबता सही है।

मैंने हाल ही में एक ही समस्या में भाग लिया। IE11 यह नहीं दिखाएगा। Func = _.bind (this.func, यह) क्रोम होगा, जबकि क्रोम होगा, कचरा कचरा बटन 100 बार इकट्ठा करने के बाद भी।

यह jsflag बकवास के साथ क्रोम चलाने के बाद भी दिखाएगा और अंतर्निहित कचरा कलेक्टर का पर्दाफाश करेगा और जीसी 100 बार कॉल करेगा।

यह साबित करने का एक आसान तरीका है कि वास्तव में यह क्रोम में रिसाव नहीं है, यह मामूली समस्या ब्राउज़र के साथ एक बड़ा मुद्दा बनाना है और इंजन को कार्रवाई करने के लिए मजबूर करना है।

उदाहरण बाध्य समारोह में डाला गया इस तरह एक नया संपत्ति आवंटित है पर:

target.WhyAmILeaking = नई सरणी (200000000) .join ("YOURNOT");

क्रोम के साथ तीन स्नैपशॉट तकनीक करें और आप उस स्ट्रिंग को लगभग 214 एमबी में देख रहे ढेर में मौजूद देखेंगे। जो भी रचनात्मक कार्रवाई (दूसरा स्नैपशॉट) दोबारा करें और आप ढेर को 423 एमबी पर देखेंगे या 214 एमबी पर रहेंगे। यदि यह रहता है तो आप कर चुके हैं क्योंकि आपने साबित किया है कि मूल 214 एमबी एकत्रित किया गया है। यदि यह आपकी विनाशकारी कार्रवाई (तीसरा स्नैपशॉट) नहीं रहता है और यह 214 एमबी पर भी वापस आ जाएगा जो मूल को एकत्रित किया गया है।

यदि यह सिर्फ 423 एमबी पर रहता है तो महोदय या महोदया का रिसाव होता है।

ओह और गरीब आत्माओं कि ठीक उसी स्थिति में भाग गया का एक और समूह: https://github.com/jashkenas/backbone/issues/2269#issuecomment-13610969

टी एल; डॉ; लीक का पता लगाने के लिए आईई 11 का उपयोग करें।

1

मैं EcmaScript में यह कहा जाता है, इस शब्द "बाध्य इस" वर्ग के साथ,

कक्षा तरीकों है "बाध्य इस", जहां इस पद्धति शरीर में हमेशा वर्ग उदाहरण के लिए बाध्य है जहाँ से इस विधि को वास्तव में विधि में पारित करने के बावजूद विधि निकाली गई थी (विधि के लिए यह पैरामीटर अनदेखा किया गया है)।

अब आप अपने उदाहरण में यहाँ तो दिया नहीं नमूना स्क्रिप्ट पर सवाल खड़ा करने के लिए विशिष्ट नहीं किया जा सकता,

मैं अगर यह लीक नहीं है कहना है है ..

तो क्या कभी आपत्ति के साथ, वर्ग स्क्रिप्ट बाध्य है, यह वर्ग/ऑब्जेक्ट मौजूद होने तक कचरा नहीं बुलाएगा क्योंकि यह फ़ंक्शन एक ही ऑब्जेक्ट से घिरा हुआ है .. यह कचरा केवल उसके माता-पिता (ऑब्जेक्ट/क्लास जिसके साथ बाध्य है) के बाद एकत्रित किया जाएगा।

अब यदि कार्य खत्म हो जाएगा तो सर्कुलर संदर्भ समाप्त हो जाएगा, >> यह रिकर्सन (दिमाग की अवधारणा, जैसा नहीं) की अवधारणा की तरह काम करता है .. तो अंत अंतिम कॉल से शुरू होगा .. रिवर्स .. आंतरिक सबसे अधिक कॉल (नवीनतम कॉल) पहले रिलीज़ किया जाएगा .. और

कोड को बग्गी होना चाहिए क्योंकि उन्हें फ़ंक्शन को बाध्य और परिभाषित नहीं करना चाहिए और हर बार पुन: उपयोग करना चाहिए .. लेकिन यदि वे बाध्यकारी हैं तो भी इसे ठीक काम करना चाहिए और जब तक पदचिह्न स्मृति पूल की ब्राउज़र सीमा से बाहर नहीं जाता है तब तक रिसाव नहीं करना चाहिए।

.. मुझे आशा है कि यह समझा जाएगा

1

आप एक "मजबूर जीसी" ट्रिगर कर रहे हैं डेवलपर उपकरण का उपयोग कर? यदि यह मामला है और वस्तुओं को तब जारी रखा जाता है तो उपर्युक्त अनुसंधान मूल्य का है।

यदि आप डेवलपर टूल के माध्यम से जीसी ट्रिगर नहीं कर रहे हैं, तो याद रखें कि जिस तरह से जीसी इंजन काम करता है वह काफी जटिल है और इसमें पीढ़ी के संग्रह (दो पीढ़ियों का उपयोग करके) की अवधारणा है।

http://www.html5rocks.com/en/tutorials/memory/effectivemanagement/#toc-v8-gc

यह बस हो सकता है कि आप एक युवा पीढ़ी जीसी चलाने के लिये आवश्यक सीमा तक न पहुंचे, या कि वस्तुओं पुराने पीढ़ी के लिए, लेकिन यह एक वर्ष पीढ़ी जीसी कभी नहीं ट्रिगर किया गया था पर्याप्त किया गया है।

दुर्भाग्य से डेवलपर टूल यह दिखाने के लिए प्रतीत नहीं होते कि कौन सी पीढ़ी जीसीडी थी।

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

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