मैं हाल ही में एक WCF Windows सेवा के स्वामित्व है कि देखने डेटा पुनः प्राप्त करने के लिए निम्न स्थिर उपयोगिता वर्ग का गहन उपयोग करता निकाल दिया है:यह कोड मेमोरी रिसाव क्यों कर रहा है?
public static class Utility
{
//begin code that causes increased memory consumption
private static Dictionary<string, ErrorData> _errorData;
internal static Dictionary<string, ErrorData> ErrorData
{
get
{
if (_errorData == null)
{
_errorData = GetErrorData();
}
return _errorData;
}
}
//end code that causes increased memory consumption
/// GetErrorData method to get error messages from error xml
/// </summary>
/// <returns>Dictionary of Error messages value for different fields.</returns>
internal static Dictionary<string, ErrorData> GetErrorData()
{
Dictionary<string, ErrorData> data = null;
XmlDocument doc = LoadXmlDocument(Constants.ErrorMessagesFileName);
XmlNodeList errorNode = doc.SelectNodes("/ErrorMessages/Error");
data = new Dictionary<string, ErrorData>();
foreach (XmlNode node in errorNode)
{
ErrorData errorValues = new ErrorData();
errorValues.FieldName = node.Attributes["FieldName"].Value;
errorValues.ErrorMessage = node.Attributes["ErrorMessage"].Value;
data.Add(node.Attributes["code"].Value, errorValues);
}
return data;
}
internal static XmlDocument LoadXmlDocument(string xmlFileName)
{
XmlDocument doc = null;
try
{
if (HttpRuntime.Cache[xmlFileName] == null)
{
doc = new XmlDocument();
doc.Load(Constants.Folderpath + "\\" + xmlFileName);
HttpRuntime.Cache.Insert(xmlFileName, doc);
}
else
{
doc = (XmlDocument)HttpRuntime.Cache[xmlFileName];
}
}
catch (Exception ex)
{
//log
}
return doc;
}
}
आप देख सकते हैं, स्थिर ErrorData संपत्ति एक निजी समर्थन का उपयोग करता है खेत। ErrorData एक शब्दकोश है जिसे फाइल सिस्टम पर एक्सएमएल संसाधन का उपयोग करके बनाया गया है, यही कारण है कि फ़ाइल की सामग्री HttpRuntime में संग्रहीत की जाती है। प्रारंभिक पुनर्प्राप्ति पर कैश करें।
सामान्य भार के तहत, सेवा लगभग 120 एमबी रैम का उपभोग करती है।
किसी बिंदु पर, एक टीम के सदस्य को आलसी लोड किए गए स्थैतिक क्षेत्र द्वारा समर्थित स्थिर संपत्ति बनाकर अनुकूलन का एक और स्तर पेश करने की आवश्यकता महसूस हुई। वैसे भी, कहा गया स्थिर क्षेत्र की उपस्थिति सेवा के लिए केवल कुछ कॉल के बाद एक गंभीर स्मृति रिसाव (500 एमबी +) का कारण बनती है।
जिस समय मैं स्थिर क्षेत्र और संपत्ति को हटाता हूं (क्लाइंट इसके बजाय उपयोगिता को कॉल करता है। गेट एररडाटा()), स्मृति खपत सामान्य स्तर पर वापस जाती है।
क्या कोई यह समझा सकता है कि इस स्थिर क्षेत्र की उपस्थिति मेमोरी रिसाव क्यों कर रही है? डब्ल्यूसीएफ सेवा InstanceContextMode.PerCall के साथ चल रही है, अगर इससे कोई फर्क पड़ता है।
बहुत धन्यवाद।
आप कैसे जानते हैं कि यह स्मृति रिसाव पैदा कर रहा है? क्या यह सिर्फ बहुत सारी मेमोरी का उपयोग नहीं कर रहा है और इसे स्थिर रखता है क्योंकि यह स्थैतिक है? आपकी सेवा का क्या चल रहा है? क्या यह पर्कल है? सिंगलटन? सत्र? –
क्या यह वास्तव में एक स्मृति रिसाव है या यह है कि जीसी पर्याप्त नहीं चल रहा है, या स्मृति को जारी करने के लिए आवश्यक नहीं मानता है। –
DEBUG मोड या रिलीज मोड में चल रहे हैं? DEBUG मोड उन स्थितियों में रिसाव करेगा जो रिलीज मोड नहीं करेंगे। – Felan