2010-05-12 13 views
6

मेरे पास एक कंसोल ऐप में होस्ट की गई एक बहुत छोटी डब्ल्यूसीएफ सेवा है।डब्ल्यूसीएफ सेवा मेमोरी लीक्स

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    void DoService(); 
} 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class Service1 : IService1 
{ 
    public void DoService() 
    { 

    } 
} 

और उसके जा रहा है कहा जाता है के रूप में

using (ServiceReference1.Service1Client client = new ServiceReference1.Service1Client()) 
{ 
    client.DoService(new DoServiceRequest()); 
    client.Close(); 
} 

कृपया याद रखें कि सेवा basicHttpBindings पर प्रकाशित हुआ है।

समस्या

अब जब मैं 1000 के एक पाश में क्लाइंट कोड ऊपर प्रदर्शन किया मैं "सभी ढेर बाइट्स" और "निजी बाइट" प्रदर्शन काउंटरों (मैं .net स्मृति प्रोफाइलर प्रयुक्त) के बीच बड़ा अंतर पाया। जांच के बाद मुझे पता चला कि कुछ ऑब्जेक्ट्स ठीक से डिस्पोजेक्ट नहीं हैं निम्नलिखित ऑब्जेक्ट्स की सूची हैं (1000 अनजान उदाहरण पाए गए -> क्लाइंट कॉल के बराबर हैं)

(उन सभी के लिए नेमस्पेस System.ServiceModel है। चैनल)

HttpOutput.ListenerResponseHttpOutput.ListenerResponseOutputStream 
BodyWriterMessage 
BufferedMessage 
HttpRequestContext.ListenerHttpContext.ListenerContextHttpInput.ListenerContextInputStream 
HttpRequestContext.ListenerHttpContext 

प्रश्न क्यों हम विमुखता वाला वस्तुओं और उन्हें कैसे नियंत्रित करने के लिए बहुत है।

कृपया मदद

+1

मुझे सिस्टम लाइब्रेरी रिसाव की तरह दिखता है। ग्राहक (उपयोगकर्ता लिखित सेवा में) कोड उन बफर और धाराओं को स्पर्श नहीं करता है, और ऐसा लगता है कि डब्ल्यूसीएफ उन्हें निपटान नहीं कर रहा है। –

+0

मबशार: क्या आपके पास इसके साथ कोई भाग्य है? मुझे एक जैसी समस्या है। – bugfixr

+0

@bugfixr क्षमा करें भाई मैंने आपको आज संदेश देखा, मुझे याद नहीं है कि मैं उनसे छुटकारा पाने में सक्षम था लेकिन मुझे याद रखने की एक बात यह थी कि मैं फ्रेमवर्क 3.5 से फ्रेमवर्क 4.0 में स्थानांतरित हुआ, इससे आंशिक रूप से या पूरी तरह से मदद मिली याद रखें लेकिन इससे मुझे किसी तरह मदद मिली। देर से प्रतिक्रिया व्यक्त करने के लिए क्षमा करें। –

उत्तर

0

मुझे 2010 में समाधान मिला लेकिन मैं इसे पोस्ट करना भूल गया। मैं वास्तव में सटीक ट्रैक खो गया लेकिन मुझे याद है कि यह नेट लाइब्रेरी बग था जिसे माइक्रोसॉफ्ट को सूचित किया गया था और उन्हें स्वीकार किया गया था। मेरे पास इसका लिंक नहीं है लेकिन जैसे ही मैं इसे ढूंढने में सक्षम हूं, मैं इसे पोस्ट करूंगा। वैसे भी माइक्रोसॉफ्ट ने इस समस्या को .NET 4.0 में तय कर दिया है और यह मेरा सही समाधान है, मैं जानता हूं कि आप में से कुछ के लिए यह संभव नहीं हो सकता है कि सर्वर वातावरण में बदलाव के कारण कभी-कभी आपके हाथों में नहीं होता है।

4

आपसे प्रत्येक कॉल एक नया उदाहरण अनुरोध कर रहे हैं (InstanceContextMode = InstanceContextMode.PerCall)। यदि 1000 कॉल में कोई जीसी नहीं हो रहा है तो सेवा के उदाहरणों को बेकार नहीं किया जाएगा। WCF आप IDisposable

लागू से MSDN : Discover Mighty Instance Management Techniques For Developing WCF Apps

की आवश्यकता है पर-कॉल सेवाएं प्रति कॉल सेवाओं विंडोज संचार फाउंडेशन डिफ़ॉल्ट इन्स्टेन्शियशन मोड कर रहे हैं। जब सेवा प्रकार प्रति-कॉल सक्रियण के लिए कॉन्फ़िगर किया गया है, तो एक सेवा उदाहरण, एक सामान्य भाषा रनटाइम (सीएलआर) ऑब्जेक्ट, केवल तभी मौजूद होता है जब क्लाइंट कॉल प्रगति पर है। प्रत्येक ग्राहक अनुरोध को एक नया समर्पित सेवा उदाहरण मिलता है। चित्रा 2 दिखाता है कि यह सिंगल-कॉल सक्रियण कैसे काम करता है।

Figure 2 Per-Call Instantiation http://i.msdn.microsoft.com/cc163590.fig02(en-us).gif

  1. ग्राहक प्रॉक्सी कॉल और प्रॉक्सी सेवा के लिए कॉल अग्रेषित करता है।
  2. विंडोज संचार फाउंडेशन एक सेवा उदाहरण बनाता है और उस पर विधि को कॉल करता है।
  3. विधि कॉल रिटर्न के बाद, यदि वस्तु को लागू करता है IDisposable, फिर Windows संचार फाउंडेशन उस पर IDisposable.Dispose कहता है।
+1

मैंने पहले इस लेख को देखा है और यह सच है कि अगर कोई है तो यह स्वचालित रूप से निपटान विधि को कॉल करें और यह केवल तभी होगा जब आपने स्वयं से कुछ संसाधन खोला है और इस मामले में सफाई करने की आवश्यकता है, तो आपको उन्हें स्वयं से साफ करना होगा। लेकिन मेरे मामले में मेरे पास साफ करने के लिए कोई संसाधन नहीं है। हालांकि मैंने पहले ही यह कोशिश की है लेकिन एक ही परिणाम। इसके अलावा मैं आपको बताना चाहता हूं कि जीसी ने ढेर को साफ कर दिया है लेकिन उन वस्तुओं के कारण मूल स्मृति को साफ नहीं किया गया है। –

1

क्या आप किसी भी अवसर से प्रदर्शन काउंटर सक्षम करते हैं? नीचे की तरह?

<system.serviceModel> 
    <diagnostics performanceCounters="All" /> 
    .. 
</system.serviceModel> 

पैरा में "प्रदर्शन काउंटर के लिए मेमोरी बढ़ाने से आकार", इस लिंक से: http://msdn.microsoft.com/en-us/library/ms735098.aspx

वहाँ एक "धूर्त" निजी बाइट्स का उल्लेख गिनती जब WCF प्रदर्शन काउंटरों सक्षम हैं। इसे सेवा में बदलना केवल इसे पूरी तरह से या पूरी तरह अक्षम करने से (ऑफ) चाल चल सकती है।

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