2017-07-28 62 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

相关问题