2017-01-03 4 views
2

私はいくつかのExternalStrctures(「FFIエフォート」の一部として)を実装しました。そのうちのいくつかについては、外部メモリを再利用するためのファイナライズを実装したいと思います。Cuis/Squeak/Pharoでファイナライズ(テスト用)を強制するには?

私はそのためにいくつかのテストを書こうとしていますが、何回もガベージコレクションを強制してもSmalltalk garbageCollectで終了しているように見えます。

ファイナライザから呼び出す関数に外部ブレークポイント(gdbを使用)を配置したが、ブレークポイントが決してヒットしないことを確認してください。 また、(多くのGCを実行した後で)オブジェクトへの参照をすべて検査しましたが、唯一の参照はWeakRegistry(allInstancesを使用してオブジェクトに取得しました)です。

ファイナライズを強制する方法はありますか(Cuis/Pharo/Squeak)?

+0

あなたはオブジェクトを見ましたか?#toFinalizeSend:to:with :? –

+0

私は、ありがとう。私の理解では、#toFinalizeSend:to:with'は元のファイナライズ動作を置き換えますが、強制終了は行いません。ファイナライズがトリガーされたことを知るためには使用できますが、ファイナライズを強制することはできません。ファイナライズを元の方法に戻すと、私の他の問題を解決するのは面白いかもしれないと思います。ニース:-) – gera

+1

ファイナライゼーションを行うプロセスに問題があることがわかりました。何らかの理由で自動的に開始されません(イメージを保存すると無効になります)。私は手動で 'WeakArray restartFinalizationProcess'を実行しています。その後、' Smalltalk garbageCollect'が強制終了します。プロセスを正しくインストールする方法を理解したら、私はその質問に答えます。 – gera

答えて

3

Smalltalk garbageCollectは常にファイナライズをトリガーする必要があります。オブジェクトが新しい場合は、Smalltalk garbageCollectMostもそれをトリガする可能性があります(VMによって異なります)。

ファイナライズはイメージ内のプロセスによって実装されることに注意してください。そのプロセスが何らかの理由で実行されていない場合、ファイナライズは行われません。

また、VMがイメージをファイナライズするイメージを送信するための歴史的に異なる方法があります。最初は、ファイナライズ処理はすべての弱いオブジェクトをスキャンする必要がありましたが、これは堅牢でしたが非効率的でした。今日では、VMとイメージは、オブジェクトを見つけてファイナライズする方法に同意する必要があります。これらが一致しない場合、ファイナライズは信頼できない可能性があります。

+0

ありがとうBert!確かなことはとてもいいです。あなたの言ったことを発見しました。ファイナライズプロセスは実行されておらず、自動的に開始されません。私は手動で 'WeakArray restartFinalizationProcess'を実行してファイナライズを開始しなければなりません。 – gera

0

私は、OpenCL.pck.stパッケージの#testFinalizationは、少なくとも最初は作業実験として役立つと思います。

+0

ここにコードを貼り付けてください。それはもっと便利だろう。 –

+0

このテストでは、Smalltlak garbegeCollectMostを実行した後でファイナライズの効果が発生すると主張しています。ここにコードを貼り付けるには、OpenCLパッケージの設計についてかなり詳細が必要ですが、それは本当に問題には関係しません。私の元の答えは全く質問に答えない、それはちょうどどこを見るべきかの示唆です。 –

関連する問題