Ruby on rails 为什么与send_数据一起发送的对象似乎保存在内存中?

Ruby on rails 为什么与send_数据一起发送的对象似乎保存在内存中?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在构建一个Rails应用程序(5.0.4,Ruby 2.3.3),使用ActionController的send_数据创建一个包含Prawn的PDF文件,并将其发送给用户,如下所示: # data is a Prawn document send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf' 我在Heroku上注意到,该应用程序似乎在创建和发送每个文档时使用

我正在构建一个Rails应用程序(5.0.4,Ruby 2.3.3),使用ActionController的send_数据创建一个包含Prawn的PDF文件,并将其发送给用户,如下所示:

 # data is a Prawn document    
 send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf'
我在Heroku上注意到,该应用程序似乎在创建和发送每个文档时使用越来越多的内存。我在本地机器上通过一些粗略的测试确认了这一点。现在,我将
GC.start
放在
send\u data
调用之后,问题似乎得到了解决。记忆总是回到一个稳定的水平


我的问题是,
send_data
是否在做一些事情让对象长时间存在?垃圾收集器不是应该不时“独立”运行吗?Heroku显示出稳定的记忆增长。多谢各位

只有当系统处于某种内存压力下,特别是当
堆空闲\u插槽
耗尽时,GC才会运行。您可以通过
GC.stat
查看有多少可用。由于通常在用完内存之前不会为使用的内存付费,所以过早释放空间没有什么意义。这样,就可以在最少的垃圾收集器调用中回收最多的空间。

谢谢。在不调用GC.start的情况下运行时,我确实注意到进程本身释放了一些MB,因此我假设这是GC自动完成的,但是,它似乎没有我显式调用它时释放的内存那么多。我假设“auto-GC”在“light模式”下运行,而不是手动触发每个未使用的对象。对此的任何进一步澄清/确认再次表示感谢。是的,它本身将以“次要”模式运行。当您显式调用它时,它以“主要”模式运行,这也将在第二代中运行GC对象。关于它的伟大文章在这里:。