Ponieważ http jest bezstanowym, każde żądanie do aplikacji tworzy nowy obiekt. Jak Railsy czyści nieużywane obiekty/jak często?Zbieranie śmieci z Ruby/Rails
Odpowiedz
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.
Jeśli jesteś tym zainteresowany, powinieneś zajrzeć do serii blogów na temat zbierania śmieci na zasadzie kopiowania przy pisaniu przez zespół Phusion i ich wysiłków na rzecz ulepszenia domyślnego schematu ruby rubowej w Ruby Enterprise Edition.
http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/
Inne linki w serii tutaj:
- 1. Zbieranie i odbieranie śmieci
- 2. Zbieranie śmieci w dalvik vm
- 3. Lua powiązania z C++ i zbieranie śmieci
- 4. Jak profilować zbieranie śmieci w Ruby
- 5. Ile czasu należy poświęcić na zbieranie śmieci?
- 6. Jak wyłączyć zbieranie śmieci w GHC Haskell?
- 7. Czy można zatrzymać zbieranie śmieci .NET?
- 8. Kończy się zbieranie śmieci z zespołu przy pomocy Unicorn + Rack
- 9. Zbieranie śmieci z systemu Android dalvik może się zawiesić?
- 10. Pytanie o statyczne elementy wewnątrz klas niestatycznych i zbieranie śmieci
- 11. wolisz korzystania del lub realokacja None (zbieranie śmieci)
- 12. Zamknięcie i zbieranie śmieci: najbardziej efektywny sposób na usunięcie kolejnych węzłów z połączonej listy
- 13. Jak mogę eksperymentować z usuwaniem śmieci?
- 14. Czas zbierania śmieci Java?
- 15. Ręczne usuwanie śmieci w Pythonie
- 16. Uzyskiwanie nieoczekiwanego zadania Wyjątek w celu usunięcia aplikacji wcześniej niż zbieranie śmieci
- 17. Java 8 metaspace wywóz śmieci
- 18. SVN: '0x00400039: Zbieranie zasobów'
- 19. Zbieranie danych wyjściowych z zadania wykonawczego MSBuild
- 20. Zbieranie szkieletu, gdzie klauzula z warunkiem LUB
- 21. wewnętrzny odnośnik zapobiega zbieraniu śmieci
- 22. Zbieranie/rozprowadzanie XML w Scali
- 23. Dlaczego pobieranie śmieci jest tak wolne?
- 24. "Wyspa izolacji" kolekcji śmieci
- 25. cURL zwrócenie śmieci dane
- 26. Wykrywanie homografii śmieci z findHomography w OpenCV?
- 27. Spoiwo zapobiegające zbieraniu śmieci
- 28. NodeJS zwracające śmieci JSON
- 29. nodejs wywóz śmieci wyjście
- 30. Odświeżenie przeglądarki nie powoduje zbierania śmieci