ActiveSupport :: Callbacks - 内存泄漏

时间:2017-05-19 18:24:46

标签: ruby-on-rails ruby memory-leaks ruby-on-rails-5

我正在调试内存泄漏并挖掘出一些有趣的东西。你需要输入你的内存泄漏或其他东西。

首先,我运行的脚本是为了验证空白状态:

require 'objspace'
ObjectSpace.trace_object_allocations_start

ENV['RAILS_ENV'] = 'production'
require File.expand_path('../../config/environment', __FILE__)
GC.start
heap_values = GC::stat[:heap_live_slots]
ObjectSpace.dump_all output: 'start.dump'

# Processing Code
10_000_00.times do 
   a = 'Some random string'
end

GC.start
heap_values2 = GC::stat[:heap_live_slots]
ObjectSpace.dump_all output: 'end.dump'

puts heap_values2 - heap_values

当我在上面的脚本上运行时,我通常会得到0negative输出。这似乎很明显,并且清楚地显示没有内存泄漏。

否,如果我用一些真正的活动记录查询和不同的json处理替换我的处理代码。堆槽的输出差异返回high number。在我的代码中通常超过1k个对象。

为了进一步挖掘,我比较了两个堆转储,并试图确定在脚本末尾堆中可用的对象,这些对象在启动时不可用。

我使用脚本https://gist.github.com/nazarhussain/e2f95518cc7e236afbbb501f1e00fbe4来比较两个堆转储。

内存中的大多数保留对象都是DATA类型并且来自 https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/callbacks.rb#L382 https://github.com/rails/rails/blob/5-0-stable/activesupport/lib/active_support/callbacks.rb#L385

任何人都可以帮助我进一步诊断。堆槽中的差异是否真的可以被视为内存泄漏?为什么那些来自回调的proc仍然保留在内存中,即使在脚本结束和GC.start之后?

0 个答案:

没有答案