我正在调试内存泄漏并挖掘出一些有趣的东西。你需要输入你的内存泄漏或其他东西。
首先,我运行的脚本是为了验证空白状态:
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
当我在上面的脚本上运行时,我通常会得到0
或negative
输出。这似乎很明显,并且清楚地显示没有内存泄漏。
否,如果我用一些真正的活动记录查询和不同的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之后?