Skip to content
  • NARUSE, Yui's avatar
    3fb51b93
    merge revision(s) 82b57d7b: [Backport… (#9795) · 3fb51b93
    NARUSE, Yui authored
    merge revision(s) 82b57d7b: [Backport #20162]
    
    	Fix memory leak when duplicating too complex object
    
    	[Bug #20162]
    
    	Creating a ST table then calling st_replace leaks memory because the
    	st_replace overwrites the ST table without freeing any of the existing
    	memory. This commit changes it to use st_copy instead.
    
    	For example:
    
    	    RubyVM::Shape.exhaust_shapes
    
    	    o = Object.new
    	    o.instance_variable_set(:@a, 0)
    
    	    10.times do
    	      100_000.times { o.dup }
    
    	      puts `ps -o rss= -p #{$$}`
    	    end
    
    	Before:
    
    	    23264
    	    33600
    	    42672
    	    52160
    	    61600
    	    71728
    	    81056
    	    90528
    	    100560
    	    109840
    
    	After:
    
    	    14752
    	    14816
    	    15584
    	    15584
    	    15664
    	    15664
    	    15664
    	    15664
    	    15664
    	    15664
    	---
    	 object.c                 |  3 +--
    	 test/ruby/test_shapes.rb | 13 +++++++++++++
    	 2 files changed, 14 insertions(+), 2 deletions(-)
    3fb51b93
    merge revision(s) 82b57d7b: [Backport… (#9795)
    NARUSE, Yui authored
    merge revision(s) 82b57d7b: [Backport #20162]
    
    	Fix memory leak when duplicating too complex object
    
    	[Bug #20162]
    
    	Creating a ST table then calling st_replace leaks memory because the
    	st_replace overwrites the ST table without freeing any of the existing
    	memory. This commit changes it to use st_copy instead.
    
    	For example:
    
    	    RubyVM::Shape.exhaust_shapes
    
    	    o = Object.new
    	    o.instance_variable_set(:@a, 0)
    
    	    10.times do
    	      100_000.times { o.dup }
    
    	      puts `ps -o rss= -p #{$$}`
    	    end
    
    	Before:
    
    	    23264
    	    33600
    	    42672
    	    52160
    	    61600
    	    71728
    	    81056
    	    90528
    	    100560
    	    109840
    
    	After:
    
    	    14752
    	    14816
    	    15584
    	    15584
    	    15664
    	    15664
    	    15664
    	    15664
    	    15664
    	    15664
    	---
    	 object.c                 |  3 +--
    	 test/ruby/test_shapes.rb | 13 +++++++++++++
    	 2 files changed, 14 insertions(+), 2 deletions(-)
Loading