Kiedyś pisałem taki program, który tworzył duże obiekty, które były krótko potrzebne (przewidywany czas życia obiektu to jeden przebieg pętli). Abstrahując od tego, jakie to były obiekty i do czego były one potrzebne (przerabiałem to z tablicami i bitmapami) spotkałem się z następującym problemem. Załóżmy, że jest taki kod:
while (Working)
{
JakasKlasa Obj = new JakasKlasa();
Obj.JakasOperacja();
}
W każdym przebiegu pętli tworzony jest obiekt o podobnym rozmiarze w pamięci. Mówi się, że zaletą .NET jest brak konieczności ręcznego zwalniania pamięci, ale okazuje się, że GC coś nie bardzo działa, bo zdarza się wyjątek "Out of memory" przy próbie tworzenia obiektu po iluś przebiegach pętli, nie ma reguły, po ilu.
Rozszerzam kod o ręczne wywoływanie GC:
while (Working)
{
System.GC.Collect(System.GC.MaxGeneration, System.GCCollectionMode.Forced);
JakasKlasa Obj = new JakasKlasa();
Obj.JakasOperacja();
}
Wtedy problemu nie ma, ale co każdy przebieg jest uruchamiany odśmiecacz.
Według moich przemyśleń, .NET tworzy obiekt według algorytmu narysowanego w załączniku. Takie postępowanie moim zdaniem miałoby sens i nie byłoby problemu braku pamięci.
Dlaczego w praktyce nie zawsze jest uruchamiany GC, tylko jest wywalany "Out of memory" bez próby oczyszczenia pamięci?
Podobny problem spotkałem w Javie, ale nie udało mi się rozwiązać, zarzuciłem projekt. Podobno nie ma możliwości uruchomienia odśmiecacza, a wywołanie system.gc() nie gwarantuje uruchomienia odśmiecacza.
Ciekaw jestem też, dlaczego .NET i Java nie przewidują ręcznego niszczenia obiektów podobnie, jak w C++. Wydaje mi się, że wprowadzenie automatycznego odśmiecacza nie przeszkadza w mozliwości ręcznego niszczenia obiektu.
Np. mogłoby być tak:
while (Working)
{
JakasKlasa Obj = new JakasKlasa();
Obj.JakasOperacja();
delete Obj;
}
Wtedy nie byłoby ani pełnego odśmiecania, ani problemów z brakiem pamieci.
Oczywistym jest, że warto przemyśleć algorytm, czy da się to inaczej bez częstego tworzenia i niszczenia obiektów, ale mi chodzi o przyczynę przedstawionych problemów.