Problem z wyciekiem pamięci

0

Mam takie pytani.
Mam program który łączy się z serwerami i pobiera z nich dane i robi z nimi różne rzeczy
Niestety po jakichś 12 godzinach pracy wielkość zajmowanej przez niego pamięci operacyjnej wzrasta dwukrotnie (liczę tak ze powinien maksymalnie 100-300MB zajmować) po dobie już zajmuje nawet 1GB.
Czy to nie jest tak, że garbage collector powinien to zwolnić? (Wydaje mi się że po prostu nie wszystko) a jeśli nie to czego on może nie zwalniać? Zastanawiało mnie, czy na przykład z tego powodu zamyka się połączenie (request.Close())
Czy za pomocą VS można znaleźć wycieki, jeśli nie to polećcie jakiś program do znajdowania wycieków w C# i .net , taki jak valgrind na przykład?

0

Połączenia i inne tego typu zasoby powinny być używane wraz z using{}, albo Finalize().

0

jeśli masz gniazda to zobacz ile masz otwartych połączeń.
Generalnie za mało danych aby coś więcej powiedzieć

0

albo Finalize().

Mógłbyś rozjaśnić ???

0
Deti napisał(a)

albo Finalize().

Mógłbyś rozjaśnić ???

Pewnie chodziło mu o Dispose();

0

Using wywołuje potem Dispose więc używając tego, autor i tak powinien jeszcze stworzyć dla danej klasy jakąś metodę zwalniającą zasoby.
(po interfejsie IDisposable)

0

Hmm... w momencie łączenia używam try { } jakby coś poszło nie tak, a w catch zwalniam zasoby.
Spróbuje rozjaśnić więcej wieczorem, ponieważ teraz tylko na chwile zerknąłem, a potrzebuje więcej czasu żeby napisać

0

zasoby zwalniaj w bloku Finally, a nie catch, tak sie nie robi, bo jak nie zlapie wyjatku to nie zwolni zasobow.

0

ogolnie to w polaczeniu mam cos takiego teraz:

            while (count > 0)
            {
                str.Append(new String(read, 0, count));
                try
                {
                    count = readStream.Read(read, 0, 256);
                }
                catch (Exception ex)
                {
                    return new ReturnBox(1);
                }
                finally
                {
                    readStream.Close();
                    response.Close();
                }
            }

ale czy finally zadziala? chyba nie...

Wczesniej bylo:
while (count > 0)
{
str.Append(new String(read, 0, count));
try
{
count = readStream.Read(read, 0, 256);
}
catch (Exception ex)
{
readStream.Close();
response.Close();
return new ReturnBox(1);
}
}

0

Zadziala. Ten drugi jest na pewno bledny, bo nie zwalniasz, jesli jest poprawnie. Czyli Twoj program zle zarzadza pamiecia kiedy dziala dobrze ;)

Najlepiej uzyc klauzuli using, wtedy masz pewnosc, ze w kazdej sytuacji zostana zamkniete.

0

"finally" zadziała zawsze, nieważne czy został złapany wyjątek czy nie.

EDIT: Sry, JohnyBravo ubiegł.

0

Nie, zwolnienie pamięci mam na samym końcu i tak, to jest kawalek wyrwany troche ze srodka. Sorki, że nie napisałem.

Chodzi o to ze tam jest "return" czyli funkcja konczy swoje dzialanie w momencie wyjatku.
ReturnBox to moja klasa ktora moze zawierac roznego typu informacje gdy aktualna funkcja skonczy dzialanie.

0

Finally i using zadziala rowniez w przypadku return.

0

A mogę w jakiś sposób sprawdzić skąd się biorą te wycieki, tzn co wycieka?

Edit: Jakiś program albo coś takiego.

0

jest masa programow :) ale raczej platne, szukaj hasla memory leaks
np. http://www.red-gate.com/products/ants_memory_profiler/index.htm

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