2016-02-23 8 views
5

मैं जानबूझ कर स्मृति बर्बाद, क्रोम (v48) में जे एस सरणियों का उपयोग कर इस बार-बार फोन करके हैं:क्रोम में, टाइप किए गए एरैस जेएस हीप पर क्यों नहीं हैं?

var rootReference; 
function wasteBunchOfMemoryWithJsArrays() 
{ 
    rootReference = rootReference || []; 
    for (var i = 0; i < 1000; i++) 
    { 
     var blah = []; 
     for (var j = 0; j < 10000; j++) 
     { 
      blah.push(j); 
     } 

     rootReference.push(blah); 
    } 
} 

तब के बारे में 700MB उपयोग, जो मोटे तौर पर सीमा निर्धारित से मेल खाता है (कार्य प्रबंधक के अनुसार) पर ब्राउज़र टैब के क्रैश performance.memory.jsHeapSizeLimit में।

लेकिन अगर मैं स्मृति बर्बाद ऐसे Int32Array के रूप में एक TypedArray का उपयोग कर, यह बार-बार फोन करके:

var typedRootReference; 
function wasteBunchOfMemoryWithInt32Arrays() 
{ 
    typedRootReference = typedRootReference || []; 
    for (var i = 0; i < 100; i++) { 
     var blah = new Int32Array(100000); 

     for (var j = 0; j < 100000; j++) { 
      blah[j] = j; 
     } 

     typedRootReference.push(blah); 
    } 
} 

तो मैं ऊपर और जा रहा है जब तक मैं हिट क्या मैं Windows 32 बिट प्रक्रिया स्मृति सीमा होने के लिए मान रख सकते लगभग 2.9 जीबी!

क्या यह केवल मामला है कि टाइप किए गए आरे जेएस ढेर सीमाओं के आसपास आते हैं? क्यूं कर? क्या TypedArrays के बारे में मुझे कुछ और चिंतित होना चाहिए?

उत्तर

4

टाइप किए गए सरणी में संग्रहीत डेटा, क्योंकि यह सभी संख्या है, अन्य वस्तुओं के किसी भी संदर्भ को शामिल करने की गारंटी नहीं है, इसलिए इसका कोई प्रभाव नहीं है कि कोई अन्य वस्तु कचरा है या नहीं। इसलिए, डेटा को कभी भी कचरा कलेक्टर द्वारा स्कैन, कॉपी या अन्यथा छेड़छाड़ करने की आवश्यकता नहीं होती है।

यह देखते हुए, कचरा कलेक्टर के ढेर के बाहर डेटा की मात्रा को कम करने के लिए कचरा कलेक्टर के ढेर के बाहर ऐसे "शुद्ध" "थोक" डेटा को रखने के लिए यह एक बहुत ही आम कार्यान्वयन रणनीति है।

इसका मतलब यह नहीं है कि दो अलग-अलग मेमोरी सीमाएं (या सीमाओं की कमी) होनी चाहिए, जैसा कि आपने देखा है, लेकिन अगर संयुक्त मेमोरी सीमा लागू करने के लिए कोई प्रयास नहीं किया जाता है, तो यही होता है।

+0

संयोग से, मुझे फ़ायरफ़ॉक्स में एक ही व्यवहार नहीं मिला। मुझे लगता है, जैसा कि आपने सुझाव दिया है, यह केवल क्रोम के लिए Google द्वारा कार्यान्वित किया गया है। मैं क्रोम वी 8 में "प्रति टैब 1 जीबी सीमा" के बारे में पढ़ता रहता हूं लेकिन मैं इसे दोहराने में सक्षम नहीं था, और ऐसा लगता है कि यह प्रदर्शन नहीं करता है। Memory.jsHeapSizeLimit। –

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