Project

General

Profile

Actions

Bug #19896

closed

Ruby method refinement memory leak

Added by HParker (Adam Hess) 8 months ago. Updated 7 months ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:114847]

Description

GitHub pull request: https://github.com/ruby/ruby/pull/8487

When method redefinitions happen, sometimes the final definition does not get cleaned up,

Reproducable with the same script from: https://bugs.ruby-lang.org/issues/19894

10.times do
  20_000.times do
    $c = Class.new do
      def foo; end
    end

    $m = Module.new do
      refine $c do
        def foo; end
      end
    end

    Class.new do
      using $m

      def initialize
        o = $c.new
        o.method(:foo).unbind
      end
    end.new
  end

  puts `ps -o rss= -p #{$$}`
end

before:

19792
20944
22224
23504
24784
26064
27344
28624
29776
31056

after:

18560
18560
18560
18560
18560
18560
18560
18560
18560
18560
Actions #1

Updated by peterzhu2118 (Peter Zhu) 8 months ago

  • Backport changed from 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN to 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED
Actions #2

Updated by HParker (Adam Hess) 8 months ago

  • Status changed from Open to Closed

Applied in changeset git|8b236e0c66da8f92e9fc33de66cfbc8e4b0c0763.


[Bug #19896]

fix memory leak in vm_method

This introduces a unified reference_count to clarify who is referencing a method.
This also allows us to treat the refinement method as the def owner since it counts itself as a reference

Co-authored-by: Peter Zhu

Updated by nagachika (Tomoyuki Chikanaga) 7 months ago

  • Backport changed from 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: REQUIRED to 3.0: UNKNOWN, 3.1: REQUIRED, 3.2: DONE

ruby_3_2 97b7070ebd5493de8d3a6a9b0ecc91bef5068d3f merged revision(s) 8b236e0c66da8f92e9fc33de66cfbc8e4b0c0763.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0