Byłem debugowania wycieków zasobów w mojej aplikacji i stworzył aplikację testową do testowania wycieków obiektów GDI. W OnPaint tworzę nowe ikony i nowe bitmapy bez ich wyrzucania. Następnie sprawdzam wzrost liczby obiektów GDi w menedżerze zadań dla każdego z przypadków. Jeśli jednak nadal będę malował główne okno aplikacji, liczba obiektów GDI wzrasta dla ikon, ale nie ma zmian dla bitmap. Czy istnieje jakiś szczególny powód, dla którego ikony nie są czyszczone w ten sam sposób, co bitmapy?Czy istnieje różnica w rozmieszczaniu ikon i bitmap?
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);
}
}
Wynik testu:
- Brak ikon i bitmap - 30 GDI obiekty
- z bitmapami - 31 GDI obiektu, liczba się nie zmienia.
- Z ikonami - 31, a następnie liczba zwiększa się, jeśli odświeżysz okno.
Posible explcation jest to, że efekt zbierania śmieci: 'Bitmap' jest zwykle * duży *' Icon' jest natomiast mała * * tak duża 'Bitmap's wyzwolić się Garbage Collection czyści 'Bitmap's (i * dispose * je), ale nie' Icon's –
@DmitryBychenko Czy nowo utworzone małe obiekty nie powinny należeć do generacji 0 i czyścić się częściej? – username
tak, generacja 0 jest skłonna do gromadzenia; Kolejną kwestią jest to, że GC zwraca uwagę na rozmiary pamięci podręcznej procesora itp., więc duży obiekt może wywołać wyrzucanie śmieci. –