我在Rails 4.2.6应用程序中有内存泄漏。控制器分配一个大的GaragesPresenter
对象作为实例变量,在请求完成后应该取消引用并进行垃圾回收。但是,我发现这种情况从未发生过。Rails内存泄漏:持有对实例的引用的控制器类
def show
@garage = GaragesPresenter.new(@garage, view_context)
respond_to do |format|
format.html
end
end
我看到的GaragesPresenter
实例的引用正在举行由GaragesController
实例,一个实例是由GaragesController
类举行。在请求完成并且已调用GC.start
很久之后,情况就是如此。 为什么GaragesController
类持有对实例的引用?
我知道这是因为我成立了一个堆转储:
require 'objspace'
...
GC.start
file = File.open("/tmp/dumpfile", 'w')
ObjectSpace.dump_all(output: file)
而生成的文件我看到以下三个对象:
以下对象是GaragesPresenter,这是非常大:
{"address":"0x7fd077217e20", "type":"OBJECT", "class":"0x7fd074a04618", "ivars":7, "references":["0x7fd0772bf940", "0x7fd077711480", "0x7fd077748188", "0x7fd077772898", "0x7fd07720c778", "0x7fd0771ef8d0", "0x7fd0771ef8d0"], "file":"/Users/dyoung/workspace/commutyble/site-app/app/controllers/garages_controller.rb", "line":19, "method":"new", "generation":35, "memsize":56, "flags":{"wb_protected":true, "old":true, "marked":true}}
于上述对象的引用被保持由GaragesController实例(预计,随着显示方法分配呈现者作为一个实例变量):
{"address":"0x7fd0727559f0", "type":"OBJECT", "class":"0x7fd0727865a0", "ivars":22, "references":["0x7fd0727558b0", "0x7fd072755888", "0x7fd072755838", "0x7fd0732400e0", "0x7fd072754a50", "0x7fd0734c5658", "0x7fd07704e878", "0x7fd0732ab020", "0x7fd072785ee8", "0x7fd077217e20", "0x7fd0771ffe10", "0x7fd07720cde0", "0x7fd0732a82d0"], "file":"/Users/dyoung/.rvm/gems/ruby-2.1.0/gems/actionpack-4.2.6/lib/action_controller/metal.rb", "line":237, "method":"new", "generation":35, "memsize":176, "flags":{"wb_protected":true, "old":true, "marked":true}}
甲参考上述GaragesController实例是由GaragesController类保存,可能会阻止garabage的收集。为什么??
{"address":"0x7fd0727865a0", "type":"CLASS", "class":"0x7fd0726a7260", "name":"GaragesController", "references":["0x7fd0727559f0", "0x7fd0726a72b0"], "file":"/Users/dyoung/.rvm/gems/ruby-2.1.0/gems/activesupport-4.2.6/lib/active_support/callbacks.rb", "line":435, "method":"instance_exec", "generation":35, "memsize":672, "flags":{"wb_protected":true, "old":true, "marked":true}}
似乎'[WeakRef](红宝石-doc的。 org/stdlib-1.9.3/libdoc/weakref/rdoc/WeakRef.html)'可以帮助 – oklas