ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

MSHTMLの弱参照を使った修正

2008-07-14 23:56:42 | PG(Java)

MSHTMLをJavaから扱うライブラリーを、弱参照リストを使うよう修正。

つまり、取得したCOMオブジェクトを弱参照リストに入れ、普通に参照されなくなってGCが実行されたら弱参照リストから削除される。
今まではこのリストが普通の(LinkedListっぽい自作の)リストだった為、自分自身も強参照でオブジェクトを保持していたから、他で保持しているのかどうか区別できなかった。したがってdispose()というメソッドを用意してそれを呼ぶ必要があるという仕様とし、それが呼ばれたときにリストから削除するという事をしていた。

でも頻繁に使うオブジェクトで一々こういう管理をするのは不細工(Javaはその観点からメモリー管理をGCで行っている訳だし)なので、dispose()を使わない方法が見つかったのは嬉しい(笑)
つーか、もっと早く知ってれば…。関連するメソッドを修正するのが、単純だけど量が多くて大変だった(苦笑)

まぁいいか、非推奨も本格的に使えたのだし(爆)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

弱参照リスト

2008-07-14 20:05:48 | PG(Java)

ThreadLocalの作りを勉強してみると、弱参照というものが出てくる。
なんかそんなようなものを聞いた記憶が脳の底に眠ってるような気がしないでもないような。(錯覚かもしれないが)

普段使っている「参照」は「強参照」というものであり、オブジェクトを弱参照で保持しておくと、他の強参照が無くなったときに(弱参照が残っていても)GCの対象になってくれる。

これがあれば、「破棄動作(例えばクローズ)が必要なんだけど、プログラマーが忘れがち(忘れても対処できない)」という事態を管理できる。
弱参照オブジェクトを見れば、破棄されたかどうか(強参照が無くなったかどうか)が分かるから。
通常の方法で管理するなら、オブジェクトをリストにでも入れておこうと思うところだが、普通のリストでは自分がオブジェクトを保持すること自体が強参照なので、自分が保持し続けている限りGCの対象にならない(=ファイナライザーが呼ばれない)というのが困りもの。
弱参照を使うと この問題が解決できる。

しかし試してみると、弱参照オブジェクト自身はどこかに(強参照で)残しておかないといけないのがちょっと使いづらいところ。
GCが動いた後にそのオブジェクトを破棄してくれるWeakHashMapというものはあるのに、WeakListというものは提供されていない。
ので、ちょっとWeakList(WeakLinkedListと名付けるべきだったか?)を作ってみた。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする