2009-07-13 12 views

Odpowiedz

12

Prosta odpowiedź: Runtime Ruby ma śmieciarza. W zależności od środowiska wykonawczego (JRuby/JVM pokoleniowa GC, generacyjna GC IronRuby/CLR, klasyczna Ruby/mark-sweep GC) stosowane są różne algorytmy. Ale podstawy są bardzo proste:

  • Na żądanie alokacji jeśli tam jest „niewystarczająca ilość wolnej pamięci” dostępny - ile jest niewystarczająca jest jednym ze składników algorytmu GC - wtedy GC rozpocznie
  • GC rozpoczyna skanowanie od korzeni, które są zmiennymi globalnymi i lokalizacjami stosów (parametry i zmienne lokalne), aby odkryć, które obiekty są wciąż żywe; zaznacza każdy znaleziony obiekt.
  • Następnie proces GC przegląda odsyłacze (odniesienia) wewnątrz tych obiektów i powraca do tych obiektów, które nie zostały jeszcze oznaczone.
  • GC może następnie rozpocząć przesuwanie/kopiowanie wszystkich zaznaczonych obiektów tak, że są zbite w pamięci
  • "Wolny wskaźnik", z którego pochodzą nowe alokacje, jest resetowany do końca tej zagęszczonej części pamięci
  • Jeśli nadal występuje "niewystarczająca ilość wolnej pamięci", to więcej jest przydzielonych z systemu operacyjnego
  • Wszystkie stare obiekty, które nie zostały oznaczone podczas skanowania, są śmieciami i są domyślnie odrzucane przez e proces kopiowania i resetowanie wolnego wskaźnika.

Częstotliwość zbiorów zależy od tuningu z GC, które mogą być dotknięte przez system operacyjny, ilość pamięci fizycznej, ciśnienia pamięci system operacyjny, Wariacje użytkownika sterowany, podkreślając korekty wersji platformy, dynamicznie optymalizowane Parametry itp. Wiele z nich sprowadza się do określenia, gdzie pasek znajduje się w teście "niewystarczającej wolnej pamięci", chociaż rzeczy stają się bardziej skomplikowane w przypadku generacyjnych kolektorów.

Powiązane problemy