Jak zredukować zużycie pamięci?

0

Witam!
Od niedawna uczę się tego języka i jak na razie moje odczucia są całkiem pozytywne. Martwi mnie tylko fakt zużycia pamięci przez programy pisane w tym języku, nie wiem czy tak jest tylko u mnie, ale skompilowany i uruchomiony pusty formularz zajmuje u mnie 13 800 K.
Stąd moje pytanie, czy da się jakoś zmniejszyć zużycie pamięci?

[Dopisane]:
Ten problem nie daje mi spokoju, jak to kurde zrobić? :(
W sumie to podejrzewam że nic nie da się zrobić, no bo co można obciąć z pustej formy? Dodam jeszcze że zauważyłem ciekawą rzecz, jak odpalam program to zajmuje tyle pomięci co pisałem wcześniej, ale jak go zminimalizuje i z powrotem przywrócę to zajmuje już tylko 2156K (i to by był git). Problem w tym że nie bardzo wiem jak tą informację wykorzystać.

P.S Pamiętam że kiedyś było coś takiego na forum Delphi/Pascal, ale nie mogę teraz tego znaleźć, a i tak nie wiem czy to by było rozwiązanie.

Pozdrawiam!

0

Mam podobny problem, prosta gra w C# i MDX po uruchomieniu zajmuje ponad 50 MB. a po minimalizacji juz 8, pytanie czy mamy powód do zmartwienia bo z tego co sie orientuje to c# sam dba o zarządzanie pamięcią, jeśli sie nie mylę zwie sie to "collection garbage", a o odzyskiwaniu pamięci jest trochę tu: http://www.microsoft.com/poland/net/podstawy/clr.mspx , wynika z tego ze gdy zaczyna my brakować pamięci to C# sprawdza czy nie ma czasem jakiś elementów do zwolnienia.

Wydaje mi sie ze tak właśnie C# został zaprojektowany, a "sztuczne" czyszczenie może odnieść odwrotny skutek.

Pozostaje pytanie czemu zwalnia pamięć przy minimalizacji, moje teoria jest taka że aplikacja wykorzystuje po prostu wolną chwile (nie aktywności) na sprzątanie.

0

Zawsze można pisać w blokach unsafe....(wiem, że to nie jest rozwiązanie :/)
Odnośnie Garbage Collectora, to poczytaj w dokumentacji o klasie System.GC (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemgcclasstopic.asp)
(metoda Collect służy chyba do wywołania GC, żeby zebrał śmieci...)
(Po polsku jest o tym parę artykułów na codeguru.pl...)
ale nie wiem czy to coś da...

0

Garbage collector w c# jest tak zrobiony, by zwalniac pamiec tylko wtedy gdy zajdzie taka potrzeba - moze sie wiec zdarzyc, ze po jakims czasie zwykle okienko bedzie zajmowac 200MB w pamieci, tylko dlatego, ze pamieci ciagle nie brakuje i nie ma potrzeby martwic sie na razie o jej zwalnianie. Dlatego sugerowanie sie aktualnym zuzyciem pamieci moze byc mylace (bo to moze byc ta czesc, ktorej uzylismy, ale juz nie uzywamy + ta, ktorej uzywamy aktualnie). Jest to o tyle dobre, ze garbage collector nie marnuje pracy proca, kiedy nie potrzeba. Taki problem jest z Java, gdzie ten proces dziala ciagle, co skutkuje wiekszym obciazeniem proca.

PS. Byc moze jest metoda do sprawdzania aktualnego 'prawdziwego' zuzycia pamieci. Jak cos zobacze to dam znac.

pozdrawiam
johny

0

Odświeżę temat. Tak się zastanawiam czy:

void Funkcja()
{
    using(object obiekt)
    {
        [...]
    }
}

w tej funkcji ten blok using jest konieczny? Czy dojscie do konca funkcji da taki sam efekt jak dojście do końca bloku using? Czy w ktoryms przypadku pamiec po obiekcie zostanie zwolniona czy tylko obiekt zostanie przekazany do gc?

1

do using daje się tylko (zresztą on tylko takie przyjmuje) obiekty implementujące IDispoidable, typi Bitmap, Graphics itp.
Z tego co wiem, sę to zasoby tak zwane niezarzędzane, i konieczne jest ich zwolnienie metodą Dispose(). using zaś to po prostu ładniejsze zapisanie bloku

try
{
Tworzenie obiektu;
// instrukcje
}
finnaly
{
Zwalnianie obiektu.
}
0

No tak, zły przykład, ale to z rozpędu. Załóżmy, że w usingu jest coś obsługujące interfejs IDisposable. Czy w podanym przykładzie jest sens tworzyć tego usinga? Jaka będzie różnica w obsłudze tego obiektu przez gc z i bez usingu.

0

Na koniec bloku using wywolywana jest metoda Dispose().
GC wywoluje metode Finalize() - nie masz kontroli kiedy to sie stanie.

0

OK. A jak by nie było using, to na koniec funkcji, Dispose() nie zostałby wywołany?

0

Nie. Nie wiem czemu miałaby być.

0

Ok. Dzięki. O to mi chodziło :)

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