मेरे पास मेरे एप्लिकेशन में एक मेमोरी रिसाव मुद्दा है जो बड़ी मात्रा में छवियों को लोड करता है। मैं सी # के बजाय नया हूं, और सोचा कि मेमोरी रिसाव के मुद्दों के मेरे दिन पिछले थे। मैं समस्या का पता नहीं लगा सकता - शायद मैं कुछ अप्रबंधित मॉड्यूल का उपयोग कर रहा हूं जो मैं सही तरीके से संभाल नहीं पा रहा हूं?छवि लोडिंग मेमोरी लीक सी #
मेरी समस्या का वर्णन करने के लिए मैंने समस्या का कारण बनने के मूल को सरल बना दिया है और इसे एक स्वच्छ परियोजना में स्थानांतरित कर दिया है। ध्यान दें कि यह सब मूर्खतापूर्ण कोड है जो मूल एप्लिकेशन को प्रतिबिंबित नहीं करता है। परीक्षण आवेदन में मेरे पास दो बटन हैं, जो दो घटनाओं को ट्रिगर करते हैं।
बटन 1 - बनाएं: किसी ऑब्जेक्ट को डेटाकॉन्टेक्स्ट पर सेट करना। यह छवियों को लोड और उन्हें जीवित रखने DataContext करने के लिए वस्तु की स्थापना करके देगा:
var imgPath = @"C:\some_fixed_path\img.jpg";
DataContext = new SillyImageLoader(imgPath);
बटन 2 - क्लीनअप: मेरी समझ है कि अगर मैं, SillyImageLoader जो फिर से छवियों रखती पकड़े संदर्भ का जाना तो जाने यह हटा दिया जाएगा। संदर्भ को छोड़ने के बाद मैं तुरंत स्मृति की मात्रा को देखने के लिए कचरा संग्रह को स्पष्ट रूप से ट्रिगर करता हूं।
DataContext = null;
System.GC.Collect();
परीक्षण करते समय मैं 974 केबी जेपीईजी छवि लोड कर रहा हूं। इस के 30 बिटमैप प्रस्तुतियों को पकड़ने से मेरे आवेदन की स्मृति उपयोग ~ 18 एमबी से ~ 562 एमबी तक बढ़ जाती है। ठीक। लेकिन जब मैंने सफाई को मारा तो स्मृति केवल ~ 2 9 2 एमबी तक गिर गई। अगर मैं + क्लीनअप बनाएं दोहराता हूं तो मुझे एक और ~ 250 एमबी मेमोरी के साथ छोड़ दिया जाता है। तो जाहिर है कि कुछ अभी भी किसी के द्वारा आयोजित किया जाता है।
namespace MemoryLeakTest
{
using System;
using System.Drawing;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
public class SillyImageLoader
{
private BitmapSource[] _images;
public SillyImageLoader(string path)
{
DummyLoad(path);
}
private void DummyLoad(string path)
{
const int numberOfCopies = 30;
_images = new BitmapSource[numberOfCopies];
for (int i = 0; i < numberOfCopies; i++)
{
_images[i] = LoadImage(path);
}
}
private static BitmapSource LoadImage(string path)
{
using (var bmp = new Bitmap(path))
{
return Imaging.CreateBitmapSourceFromHBitmap(
bmp.GetHbitmap(),
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
}
}
}
}
कोई भी विचार:
यहाँ SillyImageLoader-कोड है? समस्या बिटमैप स्रोत के साथ प्रतीत होती है। केवल बिटमैप को पकड़ना कोई स्मृति रिसाव नहीं है। मैं बिटमैप स्रोत का उपयोग कर रहा हूं ताकि इसे किसी छवि की स्रोत प्रॉपर्टी पर सेट किया जा सके। क्या मुझे यह अलग करना चाहिए? यदि ऐसा है - मैं अभी भी स्मृति रिसाव का जवाब जानना चाहता हूं।
धन्यवाद।
लोड इमेज से लौट आए बिटमैप स्रोत पर निपटान कौन कर रहा है? –
मैंने सोचा, वास्तव में इसके आधार पर एक उत्तर पोस्ट किया है लेकिन मुझे बिटमैप स्रोत पर एक निपटान नहीं दिखाई दे रहा है (मैंने जवाब हटा दिया है) –
आप अपने ऐप के मेमोरी उपयोग की निगरानी कैसे कर रहे हैं? कार्य प्रबंधक? –