2012-07-01 20 views
8

मुझे एप्पल पर विंडो रेत सफारी पर आईई, फ़ायरफ़ॉक्स, क्रोम और सफारी परीक्षण किए गए सभी ब्राउज़रों पर यह मिला है।ब्राउज़र रीफ्रेश कचरा संग्रह नहीं करता

स्पष्ट रूप से, एक ब्राउज़र रीफ्रेश, बैक बटन या फॉरवर्ड लिंक ब्राउज़र नोड्स और जावास्क्रिप्ट चर और ऑब्जेक्ट्स आदि को डंप करना चाहिए। ऐसा लगता है कि यह वेबजीएल का मामला नहीं है। मैंने पहली बार एक जटिल वेबजीएल अनुप्रयोग विकसित करते समय इसे देखा जो लगभग 100 एमबी से 200 एमबी मेमोरी की आवश्यकता है। विकास करते समय, मुझे बहुत सारे रिफ्रेश करना पड़ता है और मेरा कंप्यूटर 5-10 रीफ्रेश के बाद धीमा होना और फ्रीज करना शुरू कर देगा।

कुछ शोध के बाद मुझे एहसास हुआ कि यह नहीं होना चाहिए। मेमोरी रिसाव से स्वीकार्य समाधान पृष्ठ को रीफ्रेश करना है जो सभी जावास्क्रिप्ट ऑब्जेक्ट्स और चर और डोम नोड्स को रिलीज़ करना चाहिए। लेकिन निम्नलिखित छवियों पर एक नज़र डालें:

तो यहां क्या सौदा है? छोटे ऐप्स पर यह ध्यान नहीं दिया जाता है, लेकिन मेरे जैसे बड़े वेबजीएल ऐप्स (orbitingeden.com) के लिए यह एक वास्तविक मुद्दा है और मेरे उपयोगकर्ता यह सोचने जा रहे हैं कि सॉफ्टवेयर वास्तव में संसाधन संसाधनों की तुलना में अधिक है। निम्न छवि इन के रिफ्रेश मेरी उपलब्ध स्मृति के सभी ऊपर gobbling से पता चलता है, तो कचरा संग्रहण काम कर रहा है नहीं और/या जे एस और डोम वस्तुओं जारी नहीं किया जा रहा है:

http://orbitingeden.com/images/big_memory_after.png

किसी एक चाल के लिए मजबूर करने का पता है स्मृति का सही डंप करने के लिए ब्राउज़र? वहां सभी दस्तावेज क्यों गलत हैं?

+2

https://bugs.webkit.org/show_bug.cgi?id=76225 – gman

+0

@gman: यदि आप प्रश्न का उत्तर देते हैं, तो मैं आपको क्रेडिट दूंगा। सारांश: वेबजीएल एक संदर्भ का उपयोग करता है जो डोमेन और टैब द्वारा संरक्षित है, विशिष्ट पृष्ठ (रीफ्रेश) के अप्रासंगिक। नतीजतन, वेबजीएल प्रतिपादन को आवंटित कोई भी स्मृति कचरा संग्रहण के लिए जारी नहीं की जाती है जब तक कि उपयोगकर्ता आधार डोमेन से दूर न हो या टैब बंद कर देता है। एक संभावित फिक्स उस एप्लिकेशन पर निकास बटन जोड़ना होगा जो एक नए डोमेन पर त्वरित रीडायरेक्ट करता है जो सही बैक रीडायरेक्ट करता है। –

+0

बग किसी भी दिन तय किया जाएगा, इसलिए उम्मीद है कि जल्द ही कामकाज की आवश्यकता नहीं होगी। वास्तव में वेबग्लॉग अनुरूपता परीक्षणों (https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/tests/conformance/context/context-creation-and-destruction में इसके लिए एक परीक्षण है। एचटीएमएल) – gman

उत्तर

2

कचरा संग्रह के साथ एक बिंदु यह है कि वस्तुओं तुरंत साफ नहीं हो जाते हैं। जब कचरा संग्रह करने के लिए सबसे सुविधाजनक होता है तो कचरा कलेक्टर स्वयं के लिए निर्धारित कर सकता है।

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

+0

यह पृष्ठ सत्र के दौरान सच होना चाहिए। हालांकि, अंगूठे का नियम यह है कि एक पेज रीफ्रेश को निम्न कार्य करना चाहिए: सभी नोड्स को अनाथ करें, सभी चर अनाथ करें और उसके बाद एक कचरा संग्रह को मजबूर करें जो उन सभी हाल ही में छोड़ी गई वस्तुओं और चरों को इकट्ठा कर ले और उन्हें स्मृति से शुद्ध कर दे। भले ही, आपके सिद्धांत के अनुसार कंप्यूटर स्मृति से बाहर निकलना शुरू कर देता है, कचरा संग्रह उन सभी अप्रयुक्त वस्तुओं को एकत्रित करना चाहिए और उनका निपटान करना चाहिए। लेकिन मेरे कंप्यूटर बस इसके बजाय एक रुकावट पीसता है! –

+0

@ ऑर्बिटिंगडेन: यदि आवश्यक होने पर स्मृति एकत्र नहीं की जाती है, तो यह संभवतः वास्तविक स्मृति रिसाव की संभावना है। जब आप कम दौड़ते हैं तो कचरा कलेक्टर को लात मारना चाहिए। – Guffa

+2

तब मुझे लगता है कि प्रश्न बेहतर है: पेज रीफ्रेश और नेविगेशन में जावास्क्रिप्ट मेमोरी लीक कैसे फैल सकता है? यह असंभव है, है ना? –

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