मेरे पास कतार के रूप में उपयोग सरणी का एक दृश्य है, और मेरे पास स्मृति के बारे में इस दृश्य का एक प्रश्न है।
सबसे पहले, मैं वैश्विक में एक सरणी वस्तु बना देता हूं, और तत्व को अनियंत्रित रूप से सरणी में धक्का देने के लिए निर्माता बनाता हूं।
var arr = [];
function runningProducer() {
setInterval(itemProducer, 50);
function itemProducer() {
var item = generateItem();
arr.push(item);
}
function generateItem() {
return { a: Math.random(), };
}
}
फिर, मैं 1 सेकंड में सरणी को साफ़ करने के लिए एक ग्राहक बनाता हूं
function runningCustomer() {
setInterval(clearQueue, 1000);
function clearQueue() {
var t = arr.concat(arr);
arr = [];
}
}
और उपर्युक्त कार्यों को समय के लिए चलाते हुए, मुझे स्मृति हमेशा बढ़ रही है।
setInterval(() => {
var mem = process.memoryUsage();
console.log(mem);
}, 2000);
मुझे लगता है कि सरणी को खाली सेट के बाद स्मृति जारी करनी चाहिए, लेकिन नहीं। कृपया मुझे इस प्रश्न के बारे में कुछ शर्करा दें, और जावास्क्रिप्ट में मैन्युअल रूप से स्मृति को रिलीज़ करने का कोई तरीका है?
उत्तर:
जवाब के लिए 3 № 1इस सवाल का जवाब बरमार में हैटिप्पणी। आरक्षित स्मृति तुरंत उस क्षण को जारी नहीं की जाती है जिसकी अब आवश्यकता नहीं है। जावास्क्रिप्ट अप्रयुक्त संदर्भों का पता लगाने के लिए कचरा संग्रह पर निर्भर करता है और उन्हें ढेर में वापस छोड़ देता है, लेकिन कचरा संग्रह एक महंगी प्रक्रिया है, इसलिए यह केवल थोड़ी देर में ही चलती है।
जब मैं आपका कोड, स्मृति उपयोग चलाने की कोशिश करता हूंएक या दो मिनट के लिए बढ़ता है, और फिर कचरा संग्रह चलाते समय अचानक उसके मूल मूल्य पर वापस चला जाता है। शायद आपने बस लंबे समय तक लॉग नहीं देखा?
आप मैन्युअल रूप से कचरा संग्रह चला सकते हैं और नोड को चलाकर इसे अपने लिए देख सकते हैं --expose-gc
झंडा और निष्पादन global.gc()
लेकिन आपको चाहिए नहीं इसे तब तक उत्पादन कोड में करें जब तक आपके पास न हो बहुत अच्छा कारण।