升级到Ruby 2.6后,为什么平均可用内存插槽会急剧增加?

wei*_*dia 8 ruby memory ruby-on-rails heroku

我最近升级了Rails应用程序以使用Ruby 2.6.1,并发现平均可用内存插槽(以Heroku衡量)急剧增加。

我找不到任何相关的问题,并且很好奇是否有人看到过这个问题,或者对它为什么会发生有一个想法。有关更多信息,请参见下面的两个图表-第一个是使用Ruby 2.6.1进行部署后的总体趋势,第二个是更详细的视图,显示了内存插槽减少的重复模式。

更新到Ruby 2.6.1之后的趋势

详细视图

更新

为了提供更多背景信息,我添加了一些图表,它们显示了Ruby 2.6.1升级前后的内存使用情况和堆对象。两者非常相似,不同之处在于,在2.6.1升级之后,将释放更多对象。一切运行良好,但是我仍然对为什么会发生这种情况感兴趣。

如果这是预期的内存优化,我想知道Heroku的 / @nateberkopec的断言是否“大量的空闲插槽(例如,超过300,000个)表明存在分配大量对象并释放它们的控制器操作”,是否需要将针对Ruby 2.6进行修订。

内存使用情况: 内存使用情况

堆对象: 堆对象

Hel*_*ing 0

如果不看你的代码我就不能准确地说。

但是,请注意ruby​​ 2.6 中的垃圾收集发生了变化

我无法找到有关它的太多信息,但我注意到它发生了变化,因为临时文件的删除时间与升级前不同。我对此进行了一系列测试,似乎导致垃圾收集的触发器/条件发生了变化。

以下是我一直在查看的一些链接,但如上所述,那里没有足够的信息: https ://www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-发布/

https://rubyreferences.github.io/rubychanges/2.6.html