
Issue #20162 has been updated by nagachika (Tomoyuki Chikanaga). Backport changed from 3.0: UNKNOWN, 3.1: DONTNEED, 3.2: REQUIRED, 3.3: DONE to 3.0: UNKNOWN, 3.1: DONTNEED, 3.2: DONE, 3.3: DONE ruby_3_2 commit:c97a632363a170879b9755c5a123e92533908039 merged revision(s) commit:82b57d7bfeefd717c10f7a5a3484aca6b3e708a3. ---------------------------------------- Bug #20162: Memory leak when duplicating too complex object https://bugs.ruby-lang.org/issues/20162#change-108989 * Author: peterzhu2118 (Peter Zhu) * Status: Closed * Backport: 3.0: UNKNOWN, 3.1: DONTNEED, 3.2: DONE, 3.3: DONE ---------------------------------------- GitHub PR: https://github.com/ruby/ruby/pull/9449 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: ```ruby 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 ``` -- https://bugs.ruby-lang.org/