2012-09-30 6 views
5

Sto tentando di risolvere un problema di perdita di memoria con Rails. Posso vedere attraverso New Relic che l'uso della memoria sta aumentando senza mai diminuire.Principali fattori per perdite di memoria in Rails

Questa è una domanda derivata da un thread di grandi dimensioni (Memory constantly increasing in Rails app) in cui sono in grado di risolvere il problema. Quello che ho bisogno di sapere ora è solo:

Quali sono i principali motivi/fattori quando si tratta di perdite di memoria in Rails?

Per quanto ho capito:

  • variabili globali (come ad esempio @@ variabile) - ho nessuno di questi

  • Simboli (non ho creato alcun modo specifico)

  • Sessioni - Cosa si dovrebbe evitare qui? Diciamo che ho una sessione che tiene traccia dell'ultima query utilizzata da un particolare utente per cercare testo nel sito. Come dovrei ucciderlo?

  • "Lasciando riferimenti": cosa significa veramente? Potresti fare un esempio?

  • Eventuali altri esempi di codice errati che è possibile fornire generano normalmente perdite di memoria?

Desidero utilizzare queste informazioni per consultare il mio codice, quindi fornire esempi!

Infine, questo sarebbe "codice di perdita di memoria"?

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

che renderanno @last_products gonfio?

risposta

5

Quanto segue distruggerà le applicazioni.

Foo.each do |bar| 
    #Whatever 
end 

Se hai un sacco di Foos che li trascineranno tutti in memoria. Ho visto le app esplodere perché hanno un sacco di "Foos" e hanno un compito rake che attraversa tutte le foos, e questo compito rake richiede per sempre, diciamo Y secondi, ma viene eseguito ogni X secondi, dove X < Y. Quindi, quello che succede è che ora hanno tutti i Foos in memoria, più di una volta perché continuano a trascinare roba in memoria, ancora e ancora.

Mentre questo non può accadere esattamente all'interno di un'app web frontale, allo stesso modo non è esattamente efficiente o ricercato.

Al posto di queste soluzioni il seguente

Foo.find_each do |bar| 
    #Whatever 
end 

che recupera le cose e lotti e non mette un sacco di cose nella vostra memoria tutto in una volta.

E appena ho finito di scrivere questo ho capito che questa domanda è stata fatta nel settembre dello scorso anno ... oh ragazzo ...