上がってくる、ということが起きます。ago=beginもう少しシンプルなコードにしてみました。大量のWeakRefオブジェクトを生成すると、たまに正しく参照できない事があるようです。WeakRef::RefErrorendend正しく参照できなかった場合には、参照先のobject_idに20を足したFixnumが格納されたArrayや、caller、callerの一部と思われるStringなどが返ります。added@@final内でのMutex#synchronizeをやめる(添付のpatch1.diff)か、Mutexのロック前にGC.disableして解放後にenableする(patch2)かすれば再現しなくなりました。作っちゃうとかすれば解決できます.weakrefのマップからの削除処理は、ファイナライザから遅延させてはまずいです。削除が完了する前にファイナライザが終了してしまうと、対象のオブジェクトは再利用される可能性があり、その時点でweakrefから参照すると意図しないオブジェクトが得られることになります。第一の問題点は、weakrefのファイナライズ処理が再入不能なのに、ファイナライザ自体は再入することがあり得ることです。[ruby-dev:44527]にある再現コードのように、weakrefのファイナライズ処理で内部的に使っているMutexが外部からも容易にアクセスできてしまうことも問題といっていいでしょう。ファイナライザで再入しないようにするパッチです。僕の前にBugはない。僕の後ろにBugはできる。[ruby-dev:44562]:第一の問題点は、weakrefのファイナライズ処理が再入不能なのに、ファイナライザ自体は再入することがあり得ることです。[ruby-dev:44527]にある再現コードのように、weakrefのファイナライズ処理で内部的に使っているMutexが外部からも容易にアクセスできてしまうことも問題といっていいでしょう。ObjectSpace::WeakMapを追加してそれを使うようにしたパッチです。僕の前にBugはない。僕の後ろにBugはできる。LangLoading...。