2015-06-09 3 views
6

Ich bin auf der Suche nach einem Speicherverlust Problem in unserer Anwendung (Ruby 2.1). Ich verwende beide Techniken: ObjectSpace.dump_all zum Dumping aller Objekte in JSON-Stream dann eine Offline-Analyse. Die zweite Technik, die ich verwendete, ist Live-Analyse mit ObjectSpace.reachable_objects_from. In beiden Fällen habe ich festgestellt, dass meine ausgelaufenen Objekte von einem Objekt RubyVM::Env referenziert werden. Jeder könnte mir erklären was RubyVM::Env ist. Wie entferne ich diese Referenzen?Ruby leaked Objekte werden von RubyVm :: Env referenziert

Antwort

1

RubyVM::Env ist eine interne Ruby-Klasse, die variable Referenzen enthält. Hier ist mein Test:

require 'objspace' 

a = Object.new 
a_id = a.object_id # we use #object_id to avoid creating more reference to `a` 

ObjectSpace.each_object.select{ |o| ObjectSpace.reachable_objects_from(o).map(&:object_id).include?(a_id) }.count 
# => 1 

env = ObjectSpace.each_object.select{ |o| ObjectSpace.reachable_objects_from(o).map(&:object_id).include?(a_id) }.first 
# => #<RubyVM::Env:0x007ff39ac09a78> 

ObjectSpace.reachable_objects_from(env).count 
# => 5 

a = nil # remove reference 

ObjectSpace.reachable_objects_from(env).count 
# => 4 
Verwandte Themen