Autor Wątek: Czyszczenie po funkcji.  (Przeczytany 2709 razy)

Offline Tinekk

  • Użytkownik

# Sierpień 07, 2013, 02:42:56
Zacznę wrzuceniem kodu metody klasy:


try{
...
                   char[] separator = new char[1] { ' ' };
                    Regex vertexs_exp = new Regex(@"pattern");
                    MatchCollection matches = vertexs_exp.Matches(text);
                    foreach (Match m in matches)
                    {
                        string[] s = m.ToString().Split(separator, StringSplitOptions.RemoveEmptyEntries);

                 //       float retA = 0; float.TryParse(s[1], NumberStyles.Any, CultureInfo.InvariantCulture, out retA);
                  //      float retB = 0; float.TryParse(s[2], NumberStyles.Any, CultureInfo.InvariantCulture, out retB);
                 //       float retC = 0; float.TryParse(s[3], NumberStyles.Any, CultureInfo.InvariantCulture, out retC);
                     //   vertexs.Add(new Vector3(retA, retB, retC));
                    }
}catch(Exception e)
{
...
}
a więc, po wykonaniu takiej funkcji w pamięci zostają śmieci (te tablice stringów i matche) garbage collector czyści matche ale stringów nie tyka, ustawienie stringa na null też nie pomaga, czekałem kilka minut żeby dać mu czas jednak GC nie ma nawet zamiaru ich czyścić. Czy jest jakaś możliwość usunięcia stringów z pamięci ręcznie? Na wszystkich forach piszą że powinien się tym zająć GC, a co w wypadku jeżeli nie czyści? Tak samo dzieje się z zakomentowanymi floatami.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline koirat

  • Użytkownik

# Sierpień 07, 2013, 03:19:50
Czy mogę wiedzieć czym sprawdzasz że te stringi nadal znajdują się w pamięci ?

Skorzystaj z GC.Collect i zobacz czy nadal pozostają jakieś obiekty które planowo powinny być usunięte.

Offline Tinekk

  • Użytkownik

# Sierpień 07, 2013, 03:35:26
Menadżerem zadań, widać kiedy pamięć jest zwalniana a kiedy alokowana (są to dość duże liczby więc widać). GC.Collect() nie pomaga, brak jakichkolwiek zmian, nawet matchów nie czyści od strzała (normalnie jak i po GC.Collect() zajmuje mu to ok. 30sekund po zakończeniu funkcji)
« Ostatnia zmiana: Sierpień 07, 2013, 03:36:58 wysłana przez Tinekk »

Offline koirat

  • Użytkownik

# Sierpień 07, 2013, 11:10:29
GC.GetTotalMemory sprawdzaj tym. To ile jest pamięci użyte przez VM to co innego.

Offline Tinekk

  • Użytkownik

# Sierpień 07, 2013, 13:37:44
Hmm, ciekawe, wywołanie tejże funkcji w pętli renderującej od razu czyści mi też w menadżerze. Ale fakt faktem, skoro GC jest taki nie zastąpiony powinien sam się tym zająć żeby proces zżerający na chwile połowę ramu po wykonaniu swojego zadania zwalniał pamięć.
Czy jest jakiś powód dlaczego tego nie robi?

Offline ShadowDancer

  • Redaktor

# Sierpień 07, 2013, 14:54:39
Ponieważ ten ram może być znowu potrzebny za chwilę, a skoro jest wolna pamięć, to po co zwalniać zajętą?

Offline Tinekk

  • Użytkownik

# Sierpień 07, 2013, 15:18:25
Ponieważ ten ram może być znowu potrzebny za chwilę, a skoro jest wolna pamięć, to po co zwalniać zajętą?
Masz na myśli ram jako obszar pamięci a nie jako dane zapisane w tym obszarze, tak?

Offline ShadowDancer

  • Redaktor

# Sierpień 07, 2013, 15:35:23
Z twojego punktu widzenia, kiedy usuniesz referencje do czegoś to przestaje być danymi. Myślę, że tracisz czas na tzw. "pierdoły" - problem by występował, gdyby system (ew. Ty) potrzebował tej pamięci a .NET jej nie oddał.
Samo zagadnienie jest też trochę bardziej skomplikowane, bo zamiast system <> exe mamy system <> vm <> exe i tu może być inna polityka oddawania pamięci.
« Ostatnia zmiana: Sierpień 07, 2013, 15:39:08 wysłana przez ShadowDancer »

Offline Tinekk

  • Użytkownik

# Sierpień 07, 2013, 16:05:32
Możliwe że są to "pierdoły" jednak trochę się wystraszyłem gdy program z testowym inputem (jakieś 1-5% zamierzonego) zapycha mi 0.5GB ramu, więc dla czystego sumienia chciałem się dowiedzieć czy coś jest nie tak, w c# pisze na pałę bez żadnej wiedzy o tym języku więc mam do tego inne (może złe) podejście. Jednak jeżeli po wywołaniu funkcji sprawdzającej ile pamięci zajmuje faktycznie program uspokoiłem się troszkę.

Offline Xion

  • Moderator
    • xion.log

# Sierpień 07, 2013, 18:23:59
Cytuj
Możliwe że są to "pierdoły" jednak trochę się wystraszyłem gdy program z testowym inputem (jakieś 1-5% zamierzonego) zapycha mi 0.5GB ramu (...)
W Javie da się zmniejszyć rozmiar heapa, więc podejrzewam że w .NET jest tak samo.