2012-09-30 10 views
5

Próbuję rozwiązać problem z wyciekami pamięci w Railsach. W New Relic mogę zobaczyć, że wykorzystanie pamięci rośnie bez zmniejszenia.Główne czynniki wpływające na wycieki pamięci w Railsach

To jest pytanie typu "spinoff" z dużego wątku (Memory constantly increasing in Rails app), w którym mam problem z wykrywaniem problemu. Co muszę teraz wiedzieć, to tylko:

Jakie są główne przyczyny/czynniki, jeśli chodzi o wycieki pamięci w Railsach?

O ile mi zrozumieć:

  • zmiennych globalnych (takich jak zmienna @@) - mam żadnego z tych

  • symboli (nie zostały utworzone żadne specjalnie)

  • Sesje - Czego tu unikać? Załóżmy, że mam sesję śledzącą ostatnie zapytanie, którego użył jeden z użytkowników, kiedy wyszukiwać tekst w witrynie. Jak mam to zabić?

  • "Rezygnacja z referencji" - co to naprawdę oznacza? Czy mógłbyś podać przykład?

  • Jakieś inne złe przykłady kodowania, które możesz podać, które zazwyczaj powodują wycieki pamięci?

Chcę użyć tych informacji do przejrzenia mojego kodu, więc proszę podać przykłady!

Na koniec, czy byłby to "kod wycieku pamięci"?

ProductController 
... 
@last_products << Product.order("ASC").limit(5) 
end 

Czy to spowoduje nadek @last_products?

Odpowiedz

5

Poniższe spowoduje zniszczenie aplikacji.

Foo.each do |bar| 
    #Whatever 
end 

Jeśli masz dużo Foos, które wciągną je wszystkie do pamięci. Widziałem aplikacje wysadzane w powietrze, ponieważ mają sporo "Foos" i mają zadanie rake, które przebiega przez wszystkie foos, a to zadanie rake trwa wiecznie, powiedzmy Y sekund, ale jest uruchamiane co X sekund, gdzie X < Y. Tak więc dzieje się tak, że mają teraz wszystkie Foos w pamięci, nie raz, ponieważ po prostu ciągle wciągają rzeczy do pamięci.

Chociaż nie może się to dokładnie zdarzyć w aplikacji do oglądania z przodu w taki sam sposób, nie jest ona dokładnie sprawna ani potrzebna.

Zamiast powyższego wykonaj następujące czynności

Foo.find_each do |bar| 
    #Whatever 
end 

która pobiera rzeczy i partii, a nie wypełnia całą masę rzeczy do swojej pamięci wszystkie naraz.

I tak jak skończyłem pisać to zdałem sobie sprawę, że to pytanie zostało zadane we wrześniu zeszłego roku ... o chłopcze ...

Powiązane problemy