diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 81683b7dae4c2..b5d2129fbaf41 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -258,6 +258,10 @@ def self.inherited(child) #:nodoc: end def self.reset_subclasses + subclasses.each do |klass| + klass.instance_variables.each { |var| klass.send(:remove_instance_variable, var) } + klass.instance_methods(false).each { |m| klass.send :undef_method, m } + end @@subclasses.clear end diff --git a/activerecord/test/base_test.rb b/activerecord/test/base_test.rb index 9b5ce8a8cee9a..ae443c5329d69 100755 --- a/activerecord/test/base_test.rb +++ b/activerecord/test/base_test.rb @@ -1024,6 +1024,25 @@ def test_interpolate_sql assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo bar} baz') } end + def test_dev_mode_memory_leak + counts = [] + 2.times do + require_dependency 'fixtures/company' + Firm.find(:first) + Dependencies.clear + ActiveRecord::Base.reset_subclasses + Dependencies.remove_subclasses_for(ActiveRecord::Base) + + GC.start + + count = 0 + ObjectSpace.each_object(Proc) { count += 1 } + counts << count + end + assert counts.last <= counts.first, + "expected last count (#{counts.last}) to be <= first count (#{counts.first})" + end + private def assert_readers(model, exceptions)