2015-08-28 7 views
14

मेरे पास एक आवेदन है जिसे पुन: स्थापित करने के लिए बनाया गया है। मेरे पास कोई स्मृति रिसाव नहीं है, हालांकि मेरे पास स्कावेन्ग जीसी के दौरान बड़ी मेमोरी वृद्धि है, फिर भारी वजन चिह्न-स्वीप जीसी आता है और स्मृति को साफ करता है।स्कावेन्ग जीसी के दौरान तेज मेमोरी वृद्धि से कैसे बचें?

यह मेरे आवेदन के प्रदर्शन को प्रभावित करता है।

[2268] 266859 ms: Scavenge 61.5 (119.5) -> 46.0 (119.5) MB, 2.2 ms [allocation failure]. 
[2268] 267084 ms: Scavenge 63.7 (119.5) -> 48.3 (119.5) MB, 6.2 ms [allocation failure]. 
[2268] 267289 ms: Scavenge 66.0 (119.5) -> 50.6 (119.5) MB, 2.6 ms [allocation failure]. 
[2268] 267504 ms: Scavenge 68.3 (119.5) -> 52.8 (119.5) MB, 2.4 ms [allocation failure]. 
[2268] 267700 ms: Scavenge 70.5 (119.5) -> 55.1 (119.5) MB, 2.7 ms [allocation failure]. 
.... 

[2268] 275913 ms: Scavenge 154.2 (183.5) -> 138.8 (183.5) MB, 2.4 ms [allocation failure]. 
[2268] 276161 ms: Scavenge 157.5 (185.5) -> 142.1 (185.5) MB, 2.7 ms (+ 2.4 ms in 18 steps since last GC) [allocation failure]. 
[2268] 276427 ms: Scavenge 159.8 (187.5) -> 144.3 (187.5) MB, 2.5 ms (+ 36.3 ms in 236 steps since last GC) [allocation failure]. 
[2268] 276494 ms: Mark-sweep 147.7 (188.5) -> 43.7 (121.5) MB, 20.1 ms (+ 45.1 ms in 298 steps since start of marking, biggest step 0.5 ms) [GC interrupt] [GC in old space requested]. 

व्यवहार इस प्रकार का होता है जब मैं गैर-मौजूद URL

ab -c 100 -n 10000000 -k http://localhost:1337/invalid/url 

मैं वास्तव में क्या इस तरह के तीव्र स्मृति विकास का कारण बनता है, क्योंकि यह पूर्ण अनुरोध करेंगे ट्रैक करने के लिए नोड निरीक्षक उपयोग नहीं कर सकते तक पहुँचने का प्रयास ढेर स्नैपशॉट लेने से पहले जीसी।

इस तरह की तीव्र स्मृति वृद्धि के कारणों को ट्रैक करने के मेरे विकल्प क्या हैं?

यह पता लगाने के लिए कि कौन सी वस्तुएं scavenges से बचती हैं लेकिन मार्क-स्वीप जीसी से बचती नहीं हैं?

धन्यवाद,

UPDATE 1 तो आयु वर्ग के बीच खा सामग्री को देखने का कोई उपाय नहीं है। यहां संकेत है, यदि आप स्कावेन्ज के दौरान तेज मेमोरी वृद्धि देखते हैं लेकिन फिर यह अचानक & स्वीप के साथ गिर जाता है तो इसका मतलब यह है कि आपका कोड डेटा को बड़ी जगह में बनाता है। उदाहरण के लिए लंबे ढेर निशान। बहाल विशाल स्टैक निशान उत्पन्न करता है जिसे उत्पादन में अक्षम किया जाना चाहिए।

उत्तर

0

मेरे ज्ञान का सबसे अच्छा मध्य आयु वर्ग की सामग्री को देखने का कोई आसान तरीका नहीं है। हालांकि, यदि आप स्कावेन्ज के दौरान तेज़ मेमोरी वृद्धि देखते हैं और फिर & स्वीप होने पर अचानक गिरावट आती है तो इसका आमतौर पर मतलब है कि आपका कोड बड़ी ढेर जगह में ऑब्जेक्ट बनाता है। उदाहरण के लिए लंबे तार।

सुधार प्रत्येक त्रुटि ऑब्जेक्ट के साथ विशाल स्टैक निशान उत्पन्न करता है जो नई जगह में फिट न होने के लिए काफी बड़े हैं और इसलिए & स्वीप द्वारा अनदेखा किया जाना चाहिए।

3

आप विकल्प -–expose-gc के साथ अपने नोड स्क्रिप्ट चलाने की कोशिश कर सकते:

node --expose-gc script.js

यह जे एस के भीतर से मैन्युअल रूप से कचरा संग्रहण को गति प्रदान करने की अनुमति देता है:

global.gc();

जब कचरा संग्रहण है मैन्युअल रूप से लागू, आप एक एकाधिक स्नैपशॉट तकनीक लागू कर सकते हैं:

  • जीसी
  • के बाद से पहले एक स्नैप, एक स्नैप ले तो अनुकूलन लागू

स्नैपशॉट क्या स्मृति विकास का कारण बनता है ट्रैक करने की अनुमति है तो एक से पहले स्नैप, एक स्नैप जीसी के बाद। लक्ष्य "जीसी के बाद स्नैप" की तुलना में दूसरे "स्नैप के बाद स्नैप", का बेहतर परिणाम होना है।

+0

बेवकूफ सवाल के लिए खेद है, लेकिन मैं जीसी का आविष्कार किए बिना स्नैपशॉट कैसे ले सकता हूं? –

+0

अपने नोड एप्लिकेशन को निष्पादित करने के बाद, नोड-इंस्पेक्टर को फायर करें और 'http: //127.0.0.1: 8080/डीबग करें? पोर्ट = 5858' (या लोकलहोस्ट के बजाय आपका होस्ट) उदाहरण के लिए क्रोम देव टूल्स के साथ कनेक्ट करें और फिर जाएं "प्रोफाइल" टैब। आपको "हेप स्नैपशॉट लें" और "रिकॉर्ड हीप आवंटन" मिलेगा। –

+0

हां, यही वह है जो मैं ले रहा हूं। मैं लॉग में देखता हूं कि पूर्ण स्नैपशॉट बनाने से पहले यह पूर्ण जीसी –

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