7

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

सब कुछ ठीक हो जाता है और लगभग 0.8-1.5 के बाद कर्मचारी प्रतिक्रिया भेजता है। Work.onmessage में मैं सभी आवश्यक डीओएम क्रियाएं करता हूं। लेकिन इस जीसी के बाद सीपीयू के आधार पर 2 या अधिक सेकंड के लिए यूआई को व्यावहारिक रूप से अवरुद्ध करता है। यह वास्तव में मुझे भ्रमित कर रहा है, क्योंकि यूआई अवरोधन वह है जिसे मैं रोकना चाहता हूं।

यहाँ समय/स्मृति कंसोल टैब के स्क्रीनशॉट: http://i.imgur.com/zUoHa.jpg

आप देख सकते हैं जीसी घटनाओं बस सभी डोम जोड़तोड़ के बाद होते हैं। दरअसल केवल एक ही पश्चाताप घटना होती है (दस्तावेज़फ्रेगमेंट का उपयोग किया जाता है)।

मुख्य js कोड:

var sortWorker = new Worker('js/contactsorter.js'); 
sortWorker.onmessage = function(e) { 
    var messages = []; 
    e.data.forEach(function(userDoc) { 
     var contactSection = _drawContact(userDoc); 
     messages.push(contactSection); 
    }); 

    meta.append(messages); // this actually appends document fragment as a child 
}; 

sortWorker.postMessage(postMessageData); 

contactsorter.js (कार्यकर्ता):

onmessage = function(e) { 
    var uid, output = [], usersStat = {}; 

    // calculations... 

    postMessage(output); 
    close(); 
}; 

वहाँ किसी भी तरह से इस जगह में है या नहीं इन जीसी घटनाओं से बचने के लिए है?

यूपीडी: ऐसा लगता है कि जीसी घटना समय कार्यकर्ता को भेजी गई डेटा राशि पर निर्भर करता है। यूपीडी 2: शटडाउन और बूट जीसी घटनाओं के बाद एक बार से कम के लिए यूआई को अवरुद्ध करने के लिए केवल दो बार होता है। हम्म?

+0

ऑब्जेक्ट्स कितने बड़े हैं? कितने? हम किस तरह की संख्या बोल रहे हैं? आप क्या डोम नोड बना रहे हैं? क्रमबद्ध संपर्कों की संख्या के साथ जीसी घटना पैमाने पर रैखिक रूप से करें? –

+0

JSON.stringify का कहना है कि यह लगभग 2 एम है। ये वे वस्तुएं हैं जिनके सामान उनके बच्चों के रूप में हैं। कार्यकर्ता प्रतिक्रिया के बाद (यह एक सरणी आउटपुट करता है) मैं दस्तावेज़फ्रेगमेंट बनाता हूं और लगभग जोड़ता हूं। इसके लिए 400 "div" तत्व। बाद में मैं डीओएम को टुकड़ा जोड़ता हूं। अंतिम प्रश्न के बारे में - मुझे परीक्षण करने के लिए अपने कोड को फिर से लिखना होगा, इसलिए मैं इसे थोड़ी देर बाद टिप्पणी करूंगा।बीटीडब्ल्यू: नया यूपीडी –

+0

अंतिम प्रश्न के बारे में: नहीं, जीसी घटना डेटा राशि के हिसाब से स्केल नहीं करती है। इसके अलावा, मैं इसे समयरेखा http://i.imgur.com/psGpr.png पर भी नहीं ढूंढ सकता, हालांकि इस अवधि के लिए यूआई की घड़ी देखी जा रही है। –

उत्तर

3

वेब श्रमिकों के साथ याद रखने की एक बात, और विशेष रूप से जैसे ही आपने उन्हें अपने उदाहरण में उपयोग किया है, यह है कि जब आप इसे कार्यकर्ता को भेजते हैं तो आप वस्तु को क्लोन कर रहे हैं। तो एक मूर्खतापूर्ण उदाहरण के साथ इस के माध्यम से चलाने देता है:

  1. बड़ा वस्तु बनाएँ (एक टिप्पणी में 2 एम ने कहा ... WTF ... वाह) - 2 एम मुख्य थ्रेड
  2. पोस्ट कार्यकर्ता को, 2 एम में में आवंटित मुख्य धागा अभी भी, जो भी अतिरिक्त थ्रेड में फ्लफ के रूप में बनाया गया था, वह आपके ऑब्जेक्ट/सरणी को JSONify करने के लिए, फिर कार्यकर्ता के पास जहां 2 एम कार्यकर्ता yay
  3. कार्यकर्ता में उस चूसने वाले पर चग ... यहां मुख्य धागे में 2 एम + बस जीसी की प्रतीक्षा में बस बैठे हैं, शायद ऐसा हो सकता है ... जीसी ट्रिगर्स की एक नई मात्रा के बाद नई पीढ़ी की वस्तुएं थ्रेसहोल्ड पर आती हैं ... जैसे कि नई वस्तुओं और डोम तत्वों के एक टन के निर्माण के दौरान या उसके बाद कहें: डी
  4. कर्मचारी एक संदेश के साथ वापस प्रतिक्रिया देता है, आइए 2 एम मान लें जो अब एक नए 2 एम (याय) के लिए मुख्य धागे में नया बना दिया गया है, साथ ही ऑब्जेक्ट JSONify करने के लिए जो कुछ भी फ्लफ मेमोरी ऑब्जेक्ट्स आवश्यक है ... आप देखते हैं कि यह कहां जा रहा है।

जब से तुम ने कहा कि यह एक क्रोम एप्लिकेशन (एक और टिप्पणी), तो हो सकता है आप Transferable Objects का उपयोग करने के लिए अपने कोड वस्तु अस्थायी वस्तुओं आदि के निर्माण क्लोनिंग से बचने के लिए पुनर्गठन कोर्स, हस्तांतरणीय वस्तुओं आप उपयोग कर सकते हैं था एक सरणी बफर के रूप में पुनर्गठन करना है और यह सब एक अंधेरा जादू है।

+0

* "आपने टिप्पणी में 2 एम कहा ... wtf ... वाह" * - ग्राफिक्स, ऑडियो या एनालिटिक्स सॉफ़्टवेयर जैसे अनुप्रयोगों के लिए बहुत बड़ा सामान्य है। मैं ट्रांसफरबेल का उपयोग कर समस्याओं के बिना यहां 12 जीबी (!) के सरणी पास कर रहा हूं। –

+0

@ जॉन वेइज़ - सहमत हैं, हाल ही में मैं नियमित रूप से वेबऑडियो आदि के साथ बड़ी वस्तुओं का भी उपयोग करता हूं लेकिन 2013 के आखिर में वापस मशीन की तरह मशीन की तरह लग रहा था। मुझे लगता है कि उनकी वास्तविक समस्या का अस्थायी वस्तुओं के भार और उसके लूप या मैपर के हिस्से के रूप में और अधिक करना था ... अकेले ही डीओएम में वह क्या कर रहा था, उसे अज्ञात होने दें। –

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