मैंने ईमेल बनाने और भेजने के लिए एक विंडोज सेवा बनाई है। मैं ईमेल टेम्पलेट्स को पार्स करने के लिए Razor Engine का उपयोग कर रहा हूं। मैं मॉडल बनाने के लिए एक गतिशील ExpandoObject का उपयोग कर रहा हूँ।रेजोरइंजिन मेमोरी उपयोग
मेरी समस्या तब होती है जब प्रत्येक ईमेल बनाया जाता है और स्मृति भेजता है लेकिन इसे कभी जारी नहीं किया जाता है। मैं चींटियों मेमोरी प्रोफाइलर साथ सेवा प्रोफाइल है (मैं इस से पहले इस्तेमाल नहीं किया है), लेकिन यह निम्न परिणाम दिखा रहा है:
उस्तरा इंजन
Razor.Parse (पाठ, मॉडल के साथ 200 ईमेल पार्सिंग के साथ)
जनरेशन 1: 12.9kb
जनरेशन 2: 15.88mb
बड़े वस्तु ढेर: 290.9kb
अप्रयुक्त स्मृति नेट के लिए आवंटित: 3.375mb
अप्रबंधित: 69.51mb
स्मृति टुकड़े की कुल संख्या: 197
कोई उस्तरा इंजन
200 ईमेल अनपेक्षित पाठ लौट रहा है।
रेजर के साथजनरेशन 1: 13.87kb
जनरेशन 2: 3.798mb
बड़े वस्तु ढेर: 95.58kb
अप्रयुक्त स्मृति नेट के लिए आवंटित: 4.583mb
अप्रबंधित: 44.58 एमबी
स्मृति टुकड़ों की कुल संख्या: 7
सबसे बड़ी पीढ़ी 2 उदाहरण हैं:
System.Reflection.Emit __FixUpData [] - 2,447,640 लाइव बाइट्स, 3,138 उदाहरणों
किसी को भी किसी भी विचार क्यों वस्तुओं जारी नहीं किया जा रहा है है और जनरेशन 2 बढ़ रहा है? प्रत्येक बार जब मैं टेम्पलेट को पार्स करना चाहता हूं और जब इसे समाप्त किया जाता है तो इसे रेजरइंजिन का एक नया उदाहरण प्राप्त करने का कोई तरीका है, इसे संदर्भित नहीं किया जाएगा और जीसी में जाएगा।
Ive हर बार मैं एक टेम्पलेट पार्स खाका सेवा का एक नया उदाहरण बनाने की कोशिश की लेकिन यह नहीं चढ़े, जिस एक फर्क
using (ITemplateService templateService = new TemplateService())
{
result = templateService.Parse<ExpandoObject>(text, model);
}
यह एक पुराना सवाल है, लेकिन मुझे नहीं लगता कि 'पार्स()' कॉलम को कैश करता है। मैंने जो किया है वह 'Razor.GetTemplate()' का उपयोग कर रहा है और लौटाए गए 'ITemplate' उदाहरण पर' रन() 'को कॉल कर रहा है। अभी भी यह देखने के लिए कि असेंबली कितनी मेमोरी लेती है, लेकिन अगर इसे ठीक से कैश किया जाता है तो प्रति टेम्पलेट केवल एक असेंबली होना चाहिए। – mao47
क्या आपने सफलतापूर्वक टेम्पलेट्स को कैश किया है? मेरी सेवा में स्मृति अभी भी बढ़ जाती है और कचरा इकट्ठा नहीं होता है। क्या आपने स्मृति उपयोग में कमी देखी है? – ministrymason
वर्तमान में ITEMplate टेम्पलेट = Razor.Resolve (टेम्पलेटफाइलनाम, मॉडल) कर रहा हूँ; स्ट्रिंग परिणाम = टेम्पलेट। रुन(); लेकिन स्मृति अभी भी हास्यास्पद बढ़ने के लिए contunes। – ministrymason