我正在构建一个使用Prawn创建PDF文件的Rails应用程序(5.0.4,Ruby 2.3.3),并使用ActionController的send_data将其发送给用户,如下所示:
# data is a Prawn document
send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf'
我注意到在Heroku上,应用程序似乎在创建和发送的每个文档中使用越来越多的内存。我在本地机器上用一些原油测试证实了这一点。现在,我在GC.start
电话后放置了send_data
,问题似乎得到了解决。记忆总是回到稳定的水平。
我的问题是send_data
做了什么来保持对象长时间存在?并不是垃圾收集器不应该“不断”自行运行? Heroku表现出稳定的内存增长。谢谢。
答案 0 :(得分:2)
GC仅在系统处于某种内存压力下时运行,特别是在heap_free_slots
耗尽时。您可以查看GC.stat
有多少可用。由于您通常不会为已用完的内存付费,因此尝试过早释放空间并没有什么意义。然后,在垃圾收集器的最少调用中可以回收最多的空间。