निष्पादित करने के लिए वीएम का उपयोग करते समय नोडजेएस मेमोरी लीक अविश्वसनीय कोड को सुरक्षित रूप से चलाने के लिए मैं नोडजेएस VM Module का उपयोग कर रहा हूं। मैंने एक बड़ी मेमोरी रिसाव देखी है जो प्रत्येक निष्पादन पर लगभग 10 एम मेमोरी लेती है और इसे जारी नहीं करती है। आखिरकार, मेरी नोड प्रक्रिया 500 एम + मेमोरी का उपयोग कर समाप्त होती है। कुछ खुदाई के बाद, मैंने समस्या को वीएम के निरंतर निर्माण के लिए खोजा। मेरे सिद्धांत का परीक्षण करने के लिए, मैंने उस कोड को टिप्पणी की जो वीएम बनाता है। निश्चित रूप से, स्मृति उपयोग नाटकीय रूप से गिरा दिया। मैंने फिर कोड को असम्बद्ध कर दिया और global.gc() को समस्या क्षेत्रों के आसपास रणनीतिक रूप से कॉल किया और एक्सपोज़-जीसी ध्वज के साथ नोड चलाया। इससे मेरी स्मृति उपयोग नाटकीय रूप से कम हो गई और कार्यक्षमता बरकरार रही।अविश्वसनीय कोड
क्या इसका उपयोग करने के बाद वीएम को साफ करने का कोई बेहतर तरीका है?
मेरा अगला दृष्टिकोण कैश है वीएम दिया असुरक्षित कोड युक्त और यह पुन: उपयोग अगर यह मैं फिर से (पृष्ठभूमि असुरक्षित कोड देखें: मैं दे रहा हूँ उन पाठ के ब्लॉक के लिए अपने स्वयं के पार्स समारोह लिखते हैं, इस प्रकार, असुरक्षित कोड को अक्सर निष्पादित किया जाता है या एक बार निष्पादित किया जाता है और फिर कभी नहीं देखा जाता है)।
कुछ संदर्भ कोड।
async.each(items,function(i,cb){
// Initialize context...
var context = vm.createContext(init);
// Execute untrusted code
var captured = vm.runInContext(parse, context);
// This dramatically improves the usage, but isn't
// part of the standard API
// global.gc();
// Return Result via a callback
cb(null,captured);
});
इस https://github.com/joyent/node/issues/6552 –
के लिए बस node.js github समस्या के लिए लिंक करें VM मॉड्यूल अविश्वसनीय कोड चलाने के लिए पर्याप्त नहीं है। अविश्वसनीय भाग –
में 'जबकि (सत्य) {}' लिखने का प्रयास करें इस समस्या को अब यहां ट्रैक किया जा सकता है: https://github.com/nodejs/node/issues/3113/joyent repo का लिंक अब पुराना है । – Jeffrey