我在我的一个视图中有一个高图图形,并且可以选择一系列日期来查询和显示在图形中。我认为当我执行具有较大日期范围(例如年份范围)的查询时,内存会上升并且它永远不会恢复到正常状态,最后我需要重置服务器... 视图调用一个类方法,该方法执行查询并返回数据数组以创建图形。最初的方法是:
data = []
messages.each do |message|
record = []
record << message.occurance_time.to_s(:highcharts_format)
record << weight_according_to_metric(message.weight, us_metric_enabled)
record << temperature_according_to_metric(message.temperature, us_metric_enabled)
record << (message.humidity.nil? ? nil : message.humidity.to_f)
data << record
end
但经过一些测试后,我将 find_each 而不是 .each 放入,并将循环包装在 ActiveRecord :: Base.uncached 语句中:
data = []
ActiveRecord::Base.uncached do
messages.find_each do |message|
record = []
record << message.occurance_time.to_s(:highcharts_format)
record << weight_according_to_metric(message.weight, us_metric_enabled)
record << temperature_according_to_metric(message.temperature, us_metric_enabled)
record << (message.humidity.nil? ? nil : message.humidity.to_f)
data << record
end
end
但我仍然有记忆问题。很明显,在执行查询时,内存会增加,但为什么查询和图形创建后内存不会下降呢?
它在Heroku上与美洲狮一起运行!
有什么想法吗?
答案 0 :(得分:1)
有几个与美洲狮和红宝石2.1和2.2相关的内存泄漏报告。红宝石垃圾收集器在2.0到2.2之间经历了相当多的变化:2.1中的分代GC,2.2中的增量GC。
泄漏报道:
https://github.com/puma/puma/issues/342
https://github.com/puma/puma/issues/978
我注意到从Ruby 2.0升级到2.2后出现的类似问题。经过几个毫无结果的研究和测试后,我终于转向最新的稳定Ruby [2.3.1],Rails [4.2.6]和puma [3.4.0]版本。泄漏消失了。