[ruby-core:95520] [Ruby master Bug#16278] Potential memory leak when an hash is used as a key for another hash
From:
mame@...
Date:
2019-10-23 23:43:38 UTC
List:
ruby-core #95520
Issue #16278 has been updated by mame (Yusuke Endoh).
Status changed from Open to Rejected
Ruby uses so-called conservative GC, which is inexact. It is not guaranteed that an object is collected when it becomes unreachable.
You can confirm that it does not cause leak by the following code:
```ruby
def create
h = {{:a => 1} => 2}
h.keys.first.object_id
end
loop { create }
```
This code uses constant memory. If it caused memory leak, the memory usage would continue to increase.
----------------------------------------
Bug #16278: Potential memory leak when an hash is used as a key for another hash
https://bugs.ruby-lang.org/issues/16278#change-82293
* Author: cristiangreco (Cristian Greco)
* Status: Rejected
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin18]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
Hi,
I've been hitting what seems to be a memory leak.
When an hash is used as key for another hash, the former object will be retained even after multiple GC runs.
The following code snippet demonstrates how the hash `{:a => 1}` (which is never used outside the scope of `create`) is retained even after 10 GC runs (`find` will look for an object with a given `object_id` on heap).
```ruby
# frozen_string_literal: true
def create
h = {{:a => 1} => 2}
h.keys.first.object_id
end
def find(object_id)
ObjectSpace.each_object(Hash).any?{|h| h.object_id == object_id} ? 1 : 0
end
leaked = create
10.times do
GC.start(full_mark: true, immediate_sweep: true)
end
exit find(leaked)
```
This code snippet is expected to exit with `0` while it exits with `1` in my tests. I've tested this on multiple recent ruby versions and OSs, either locally (OSX with homebrew) or in different CIs (e.g. [here](https://github.com/cristiangreco/ruby-hash-leak/commit/285e586b7193104989f59b92579fe8f25770141e/checks?check_suite_id=278711566)).
Can you please help understand what's going on here? Thanks!
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>