2010-09-15 181 views
0

嗨,下面的代碼:的Ruby/Rails的內存使用情況

def process(batch_size=1000) 
    claim_numbers.each_slice(batch_size) do |numbers_batch| 
     claims = Claim.find(:all, :conditions => ["claim_number in (?)", numbers_batch]) 
     # do something with claims 
    end 
    end 

在我的Rails的車型之一,我處理了很多claim_numbers,我爲了不模擬find_in_batches方法加載大量的記錄到內存中,然後我的問題是:就內存而言,在每次迭代中claims變量會發生什麼? Ruby的GC什麼時候釋放這部分內存?

任何幫助和提示,將不勝感激,在此先感謝!

更新:使用Ruby 1.8.7-P72

回答

1

紅寶石將盡快釋放內存作爲GC運行。由於聲明的範圍在each_slice塊內,因此聲明在塊之外沒有任何引用,並且在聲明被重新分配(由於下一次迭代)時,先前分配的對象將變爲未引用。 每個對象的內存都會保留,直到GC啓動。GC運行的頻率可以通過一些環境變量指定(更多信息,請參閱http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/)。

如果由於某種原因您保留了對象(因爲仍然有對它的引用,例如將對象放在數組或散列中),則不會釋放該對象的內存。 如果你監視你的應用程序,你可以看到增加的內存使用量,但也增加了CPU使用率,因爲ruby的GC是非世代的,這意味着它遍歷所有對象,每次都看看它們是否可以收集。

+0

謝謝!得檢查那篇博文!你使用什麼技術/工具來監控你的應用程序? – jpemberthy 2010-09-16 12:56:45

+0

我們之前已經轉向了JRuby,現在這允許我們使用一些不錯的Java監視工具(如JConsole和VisualGC)。轉移到JRuby也使我們能夠更好地調整GC設置。 – xinit 2010-09-17 15:54:52