मैं अपने आवेदन में संसाधन लीक डीबग कर रहा था और जीडीआई ऑब्जेक्ट लीक का परीक्षण करने के लिए एक टेस्ट ऐप बनाया था। ऑनपेंट में मैं उन्हें डिस्प्ले किए बिना नए आइकन और नए बिटमैप्स बना देता हूं। उसके बाद मैं प्रत्येक मामले के लिए टास्क मैनेजर में जीडीआई वस्तुओं की वृद्धि की जांच करता हूं। हालांकि, अगर मैं अपने ऐप की मुख्य विंडो को पुनर्स्थापित करना जारी रखता हूं, तो जीडीआई ऑब्जेक्ट्स की संख्या आइकन के लिए बढ़ जाती है, लेकिन बिटमैप्स के लिए कोई बदलाव नहीं होता है। क्या कोई विशेष कारण है कि आइकन बिटमैप्स के समान तरीके से क्यों साफ नहीं हो रहे हैं?आइकन और बिटमैप का निपटान करने में कोई अंतर है?
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 1. icon increases number of GDI objects used by this app during repaint.
//var icon = Resources.TestIcon;
//e.Graphics.DrawIcon(icon, 0, 0);
// 2. bitmap doesn't seem to have any impact (only 1 GDI object)
//var image = Resources.TestImage;
//e.Graphics.DrawImage(image, 0, 0);
}
}
परीक्षण परिणाम:
- कोई भी आइकन और बिटमैप्स - 30 GDI वस्तुओं
- बिटमैप्स के साथ - 31 GDI वस्तु, नंबर नहीं बदलता है।
- आइकन के साथ - 31 और फिर यदि आप खिड़की को पेंट करते हैं तो संख्या बढ़ जाती है।
Posible explcation है कि यह कचरा संग्रहण प्रभाव है: Bitmap' आमतौर पर है '* बड़े * जबकि' Icon' है * छोटे * इतनी बड़ी 'Bitmap's अप को गति प्रदान कचरा संग्रह जो 'बिटमैप' (और * उनका निपटान *) को साफ़ करता है लेकिन 'आइकन' –
@DmitryBychenko नहीं बनाया जाना चाहिए छोटे वस्तुओं को पीढ़ी 0 से संबंधित नहीं होना चाहिए और अधिक बार साफ किया जाना चाहिए? – username
हां, पीढ़ी 0 एकत्रित होने के लिए प्रवण है; एक और मुद्दा यह है कि जीसी सीपीयू कैश आकार आदि पर ध्यान देता है, इसलिए एक बड़ी वस्तु कचरा संग्रह को ट्रिगर कर सकती है। –