2017-07-28 40 views
3

我建立一個Rails應用程序(5.0.4,2.3.3紅寶石)創建具有大蝦一個PDF文件,並將其發送給用戶,使用的ActionController的SEND_DATA,就像這樣:爲什麼使用send_data發送的對象似乎被保存在內存中?

# data is a Prawn document  
send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf' 

我我們注意到Heroku的應用程序似乎在創建和發送每個文檔時使用的內存越來越多。我在本地機器上用一些粗略的測試證實了這一點。現在,我在send_data調用後放置了GC.start,問題似乎得到解決。內存總是回到穩定的水平。

我的問題是,send_data做一些事情來保持對象很長一段時間嗎?垃圾收集器是否應該不時地「獨立運行」? Heroku顯示內存持續增加。謝謝。

回答

2

只有在系統處於某種內存壓力下,特別是在heap_free_slots耗盡時,GC纔會運行。你可以看到有多少可用GC.stat。由於您通常不會爲使用過的內存付錢,所以在嘗試過早釋放空間時毫無意義。然後可以在垃圾收集器的最少調用中回收大部分空間。

+1

謝謝。在沒有調用GC.start的情況下運行時,我確實注意到這個進程自己釋放了幾MB,所以我認爲GC是自動執行它的事情,但是,當我打電話時,它似乎沒有釋放盡可能多的內存它明確。我假設「自動GC」以「光照模式」運行,而不是手動觸發每一個未使用的對象。任何進一步澄清/確認這一點再次非常感謝。 – flavio

+2

是的,就它自己而言,它將以「小」模式運行。當你明確地調用它時,它將以「主要」模式運行,這也將是第二代中的GC對象。關於它的大文章在這裏:https://www.speedshop.co/2017/03/09/a-guide-to-gc-stat.html。 – Segfault

相關問題