😸
[Feature #19333] Fiber Local / Thread Local / Fiber Storage から値を削除する提案
[Feature #19333] Setting (Fiber Local|Thread Local|Fiber Storage) to nil should delete value in order to avoid memory leaks.
- メモリリークを回避するために
Fiber Local / Thread Local / Fiber Storage
にnil
を割り当てたら値を削除する提案 - 現状だとキーと値の関連付けを削除する方法がなくて動的に値を割り当て続けると時間とともにリークする可能性がある
100.times do |i|
name = :"variable-#{i}"
# ここで割り当てた値はずっと残り続ける
# こういうコードが複数ある場合に時間とともにメモリを消費し続ける可能性がある
Thread.current[name] = 10
end
- なので何かしら意図的に『値を削除する仕組みがほしい』というのがモチベーションになる
- 今回の提案では『
nil
を割り当てたら関連付けを削除する』ような提案になる- 関連付けを削除することで元々割り当てられていた値が GC に乗っかってくるのかな
100.times do |i|
name = :"variable-#{i}"
Thread.current[name] = 10
Thread.current[name] = nil # 関連付けを削除する
end
- 『
nil
を割り当てると〜』という部分でnil
を有効な値として扱っているケースで問題がある、みたいなコメントがされていますねー- https://bugs.ruby-lang.org/issues/19333#note-2
- このあたりの塩梅は難しそう
- これ自体は承認されたんですが上のようなケアをする必要があるみたいですね
- っていうのが2年ぐらい前にやり取りされていて Ruby 3.3 では
Fiber#storage
では既に実装されているみたい - それ以降は特に実装とかの話は進んでいないのかな?
Discussion