我可以通过显式销毁实例变量来保存Ruby内存吗?

时间:2016-10-14 19:39:09

标签: ruby-on-rails ruby memory heroku

当没人使用应用程序时,我的rails应用程序的内存使用量会稳定增加单独留下,它会在几个小时内超过Heroku限制512 MB。

编辑#1:经过下面详细介绍的一些更改后,我发现内存使用率水平低于最大值。我认为没有内存泄漏;它看起来是对数的。我会应用一些压力(用法)来看看它是如何起作用的。

我有一些创建Hash,String和(numeric)Array实例变量的方法。我可以通过在不再需要它们之后从内存中清除这些实例变量来减少内存使用吗?

我想在完成之后将变量设置为nil,或者使用remove_instance_variable,就像remove_instance_variable(:@foobar)每次我完全使用变量一样。

这是一个明智的尝试吗?如果是这样,这是删除实例变量的好方法吗?或者我必须运行GC.start

编辑#2:我使用实例变量的唯一原因是在多个较小的方法之间传递它们,所有这些方法都在一个服务对象中。那么也许它会使用更少的内存来简单地使用一个只使用局部变量的更大(不太清晰)的方法?或者每个较小的方法采用的参数?基本上,我正在寻找运行涉及许多变量的大型方法的最节省内存的方法。

编辑#3:在生产中运行几次大方法后,内存使用率会上升(从最大512MB的约60%到约80%)然后保持不变。所以我很确定除了应用程序优化内存使用的其他方法外,这种特殊方法也是罪魁祸首。

我尝试了其他几种减少内存使用的方法,包括:

  • 删除不需要的宝石
  • 将“foo”+“bar”更改为“foo”<< “酒吧”
  • 减少过多的ActiveRecord查询

在我的heroku控制台中:

irb(main):001:0> ObjectSpace.count_objects
=> {:TOTAL=>557200, :FREE=>116793, :T_OBJECT=>18594, :T_CLASS=>7161, :T_MODULE=>1016, :T_FLOAT=>9, :T_STRING=>261936, :T_REGEXP=>2270, :T_ARRAY=>68972, :T_HASH=>11010, :T_STRUCT=>841, :T_BIGNUM=>10, :T_FILE=>6, :T_DATA=>39779, :T_MATCH=>91, :T_COMPLEX=>1, :T_RATIONAL=>901, :T_SYMBOL=>781, :T_NODE=>24726, :T_ICLASS=>2303}

0 个答案:

没有答案