.NET Framework
स्मृति प्रबंधन
खोज…
टिप्पणियों
प्रबंधित .NET अनुप्रयोगों में प्रदर्शन-महत्वपूर्ण अनुप्रयोग गंभीर रूप से GC से प्रभावित हो सकते हैं। जब जीसी चलता है, तो अन्य सभी धागे को पूरा होने तक निलंबित कर दिया जाता है। इस कारण से, जीसी प्रक्रियाओं का सावधानीपूर्वक मूल्यांकन करने और यह निर्धारित करने की सिफारिश की जाती है कि यह कब चलता है।
मानव रहित संसाधन
जब हम GC और "हीप" के बारे में बात करते हैं, तो हम वास्तव में प्रबंधित हीप को क्या कहते हैं, के बारे में बात कर रहे हैं । प्रबंधित हीप पर ऑब्जेक्ट संसाधनों को प्रबंधित हीप पर नहीं पहुँचा सकते हैं, उदाहरण के लिए, जब किसी फ़ाइल से लिखना या पढ़ना हो। अप्रत्याशित व्यवहार तब हो सकता है जब, एक फ़ाइल को पढ़ने के लिए खोला जाता है और फिर एक अपवाद होता है, फ़ाइल के हैंडल को बंद होने से रोकता है जैसा कि सामान्य रूप से होता है। इस कारण से, .NET के लिए यह आवश्यक है कि अप्रबंधित संसाधन IDisposable
इंटरफ़ेस लागू करें। इस इंटरफ़ेस में एक एकल विधि है, जिसे Dispose
नहीं पैरामीटर कहा जाता है:
public interface IDisposable
{
Dispose();
}
अप्रबंधित संसाधनों को संभालते समय, आपको यह सुनिश्चित करना चाहिए कि वे ठीक से निपटाए गए हैं। आप finally
ब्लॉक में या एक using
बयान के साथ स्पष्ट रूप से Dispose()
बुलाकर ऐसा कर सकते हैं।
StreamReader sr;
string textFromFile;
string filename = "SomeFile.txt";
try
{
sr = new StreamReader(filename);
textFromFile = sr.ReadToEnd();
}
finally
{
if (sr != null) sr.Dispose();
}
या
string textFromFile;
string filename = "SomeFile.txt";
using (StreamReader sr = new Streamreader(filename))
{
textFromFile = sr.ReadToEnd();
}
उत्तरार्द्ध पसंदीदा तरीका है, और संकलन के दौरान स्वचालित रूप से पूर्व में विस्तारित किया जाता है।
सुरक्षित संसाधनों का उपयोग करते समय सेफहैंडल का उपयोग करें
अप्रबंधित संसाधनों के लिए रैपर लिखते समय, आपको IDisposable
और खुद को अंतिम रूप देने की कोशिश करने के बजाय SafeHandle
को उप-वर्ग करना चाहिए। आपके SafeHandle
उपवर्ग एक हैंडल रिसाव की संभावना को कम करने के लिए जितना संभव हो उतना छोटा और सरल होना चाहिए। इस संभावना का मतलब है कि आपके सेफहैंडल कार्यान्वयन में एक वर्ग का आंतरिक कार्यान्वयन विवरण होगा जो इसे एक उपयोगी एपीआई प्रदान करने के लिए लपेटता है। यह वर्ग सुनिश्चित करता है कि, भले ही कोई प्रोग्राम आपके SafeHandle
इंस्टेंस को लीक करता है, आपका अप्रबंधित हैंडल जारी हो जाता है।
using System.Runtime.InteropServices;
class MyHandle : SafeHandle
{
public override bool IsInvalid => handle == IntPtr.Zero;
public MyHandle() : base(IntPtr.Zero, true)
{ }
public MyHandle(int length) : this()
{
SetHandle(Marshal.AllocHGlobal(length));
}
protected override bool ReleaseHandle()
{
Marshal.FreeHGlobal(handle);
return true;
}
}
अस्वीकरण: यह उदाहरण के साथ एक कामयाब संसाधन की रक्षा के लिए कैसे दिखाने के लिए एक प्रयास है SafeHandle
जो लागू करता है IDisposable
उचित रूप से आप और कॉन्फ़िगर finalizers के लिए। इस तरह से स्मृति का एक हिस्सा आवंटित करने के लिए यह बहुत ही आकस्मिक और संभावनाहीन है।