2015-06-09 15 views
6

Mi riferisco a un problema di perdita di memoria nella nostra applicazione (Ruby 2.1). Sto utilizzando entrambe le tecniche: ObjectSpace.dump_all per scaricare tutti gli oggetti nello stream JSON, quindi eseguire un'analisi offline. La seconda tecnica che ho usato è l'analisi dal vivo con ObjectSpace.reachable_objects_from. In entrambi i modi, ho trovato che i miei oggetti trapelati sono referenziati da un oggetto RubyVM::Env. Qualcuno potrebbe spiegarmi cos'è RubyVM::Env. Come rimuovere quei riferimenti?RubyVm :: Env

risposta

1

RubyVM::Env è una classe di rubini interni che contiene riferimenti variabili. Ecco il mio 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