2015-05-13 43 views
7

का उपयोग करते समय मेमोरी रिसाव मेरे पास ईएफ का उपयोग करके एक बहुत ही सरल एप्लीकेशन है। लेकिन जब यह एक सप्ताह चलता है, तो स्मृति उपयोग भयानक होता है (पहले केवल 80 एमबी, एक सप्ताह के बाद 700 एमबी)। जब मैं अपने आवेदन को प्रोफाइल करने के लिए dotMemory का उपयोग करता हूं। मुझे लगता है कि हीप पीढ़ी 2 की याददाश्त हर समय बढ़ रही है।एंटिटी फ्रेमवर्क

only run 40 minutes

मैं एक स्नैपशॉट प्राप्त करें, अंत में मिल एफई dbcontext का बरकरार रखा बाइट्स सबसे अधिक है।

enter image description here

मैं बहुत उलझन में हूँ। मेरा आवेदन इतना आसान है। कोड का नमूना:

protected CarbonBrushMonitorEntities _entities = new MYEntities(); 
public void Add(HistoryData data) 
{ 
    _entities.HistoryDatas.Add(data); 
    _entities.SaveChanges(); 
} 

_entities केवल नाम के पहले अक्षर एक बार प्रारंभिक समय में है, तो हर समय इस्तेमाल किया।

समारोह Add अक्सर कहा जाता है, के बारे में 3 बार/सेकंड

मैं एक लंबे समय गूगल, और इस तरह के रूप में कुछ तरीकों की कोशिश:

_entities.Configuration.ValidateOnSaveEnabled = false; 
_entities.Configuration.AutoDetectChangesEnabled = false; 
_entities.Configuration.LazyLoadingEnabled = false; 

लेकिन इन काम नहीं करते।

+0

आप अपने ईएफ संदर्भ का जीवनकाल कैसे प्रबंधित करते हैं? क्या आपने कभी इसका निपटान/पुन: बना लिया है? – ken2k

+0

@ ken2k प्रारंभ समय पर बनाते हैं, फिर हर समय उपयोग किया जाता है। कभी निपटान/पुन: निर्मित नहीं करें। क्योंकि मेरा एप्लिकेशन आर्किटेक्चर आईओसी और निर्भरता इंजेक्शन का उपयोग करता है। – yubaolee

+0

ऐड विधि किस श्रेणी में है? – lloyd

उत्तर

15

आप इकाई की रूपरेखा का उपयोग करते हैं, तो आप संदर्भ बनाना चाहिए बस से पहले आप इसे और जितनी जल्दी हो सके के रूप में यह निपटाने की जरूरत है:

using (var someContext = new SomeContext()) 
{ 
    // your commands/queries 
} 

कभी स्मृति में संदर्भ रख सकते हैं या अलग-अलग कॉल के पार का हिस्सा ।

DependencyFactory.RegisterType(typeof(SomeContext)); 

और की तरह एक संदर्भ रिसोल्वर (यह भी निश्चित रूप से आईओसी के साथ पंजीकृत) का उपयोग करें::

क्या मैं आम तौर पर करते हैं एक आईओसी कंटेनर के साथ संदर्भ रजिस्टर है

using (var someContext = _contextResolver.ResolveContext()) 
{ 
    // your commands/queries 
}  

जहां संकल्प किया जाता है जैसे:

public class ContextResolver : IContextResolver 
{ 
    public ISomeContext ResolveContext() 
    { 
      return DependencyFactory.Resolve<SomeContext>(); 
    } 
} 

ईएफ संदर्भ वास्तव में आपके काम की इकाई है, जो होना चाहिए एक बार आपको इसकी आवश्यकता नहीं होने के बाद निपटाया जाता है।

+0

आपको बहुत धन्यवाद – yubaolee

+1

यह भी जोड़ने के लिए धागा सुरक्षित नहीं है! और इसलिए इसे रखने/थ्रेड के बीच साझा करने का कोई कारण नहीं है। –

+0

@ जी.वाय: अच्छा बिंदु भी! –

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