Zwalnianie pamięci

0

Cześć.
Pisze aplikację, która ma za zadanie wczytać sporą ilość dużych obrazków.

Aktualnie testuję sobie klasy sprawdzające obrazki pod różnymi względami (np czy są takie same itp.)

mam taki kod:

private void IsEqual()
        {
            using(Bitmap bmp1 = new Bitmap(5000, 5000, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
            {
                using (Bitmap bmp2 = new Bitmap(5000, 5000, System.Drawing.Imaging.PixelFormat.Format32bppRgb))
                {
                    Graphics g1 = Graphics.FromImage(bmp1);
                    g1.FillEllipse(new SolidBrush(Color.Black), 0, 0, 50, 50);
                    g = Graphics.FromImage(bmp2);
                    g.FillEllipse(new SolidBrush(Color.Black), 0, 0, 50, 50);
                    MemoryImage MemoryImg1 = new MemoryImage("Nowy", (Image)bmp1);
                    MemoryImage MemoryImg2 = new MemoryImage("Nowy", (Image)bmp2);
                    this.test.SaveTestResult(this.test.AreEqual(MemoryImg1, MemoryImg2), "IsEqual()");
                    g.Dispose();
                }
            }
        }

Funkcja:
this.test.SaveTestResult(this.test.AreEqual(MemoryImg1, MemoryImg2), "IsEqual()");
zapisuje mi wynik porównania do logu, abym wiedział czy wszystko dobrze działa. Taki ala test.
Problem w tym, że kod ten pożera trochę pamięci fizycznej, ale tylko za pierwszym wywołaniem.
Oto przykład:
Przed wywołaniem kodu:

  • Użycie pliku Stror = 792MB
  • Dostępnej pamięci fizycznej = 2097940

po wywołaniu funkcji

  • Użycie pliku Stror = 940MB
  • Dostępnej pamięci fizycznej = 1947080

I teraz już niezależnie ile razy wywołam funkcję już tak pozostaje. Skąd ten pojedynczy pierwszy wyciek? A może to nie wyciek? Da się temu jakoś zapobiec?

0

Ok już chyba znam odpowiedź.
Oczywiście winę za to ponosi GarbageCollector, który w swój sposób i w swoim czasie usuwa śmieci.

Zapewne chodzi o to, że za pierwszym razem nie ma potrzeby usuwać śmieci, jednak za drugim już tak.
Aby śmieci był usnięte od razu wystarczy wywołać: GC.Collect().

I po sprawie :)

0

Skoro wywołujesz .Dispose() na g, to czemu też nie na g1?

0

Literówka.
Tam nie ma g1 tylko g.
Wpisało mi się źle.

0

Co to jest MemoryImage? Być może gdzieś zostaje jakiś pojedynczy uchwyt do referencji i GC zwolnić bitmap nie może.

0

MemoryImage to klasa:

class MemoryImage
    {
        private string Name;
        private MemoryStream MyImage = new MemoryStream();

        public override bool Equals(object obj)
        {
            if (GetType() == obj.GetType())
            {
                MemoryImage buff = (MemoryImage)obj;
                if (buff.GetName() != this.Name) return false;
                return OperationOnImage.Compare(this.GetImage(), buff.GetImage());
            }
            else
                return false;
        }

        public override int GetHashCode()
        {
            return this.GetImage().GetHashCode();
        }

        public MemoryImage(string name, Image image)
        {
            this.Name = name;
            image.Save(this.MyImage, System.Drawing.Imaging.ImageFormat.Jpeg);
        }

[...]

Ma ona za zadanie trzymać w pamięci obrazki, jeśli zajdzie taka potrzeba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1