2003年07月21日
川俣晶の縁側ソフトウェア技術雑記total 2775 count

弱い参照、WeakReferenceのIsAliveとTargetの関係

Written By: 川俣 晶連絡先

 りすと亭の過去ログ再作成の機能で、意図しない例外が起きるというレポートがありました。調べてみると、どうも、「弱い参照」関係の問題のようでした。

 りすと亭のメッセージスレッド関係の機能は、「弱い参照」の機能を使って、情報のキャッシュを実現しています。滅多に参照されないメッセージスレッドの情報はガベージコレクションで消え去って頂くけれど、消え去るまではメモリ上にあって高速にアクセス可能な状態にあります。

 既に消えているかどうかを判定するために、WeakReferenceクラスのIsAliveプロパティをチェックしていて、これがtrueであればまだあると見なして、Tagetプロパティを経由して目的のオブジェクトを取得していました。しかし、データ量が極めて膨大なリスト板の過去ログ再作成では、膨大な情報を扱うため、ガベージコレクションが頻発するようで、ここで例外が起きていたようです。つまり、IsAliveプロパティをチェックしたあとでガベージコレクションが走ると、その時点で目的のオブジェクトがメモリ上から失われていた可能性があり得るのです。

 なぜ、IsAliveプロパティをチェックするだけでOKと思ったかはもう覚えていません。何かの資料を読んでそう理解したような記憶があります。ですが、それは間違いでした。資料の誤読だったかも知れません。

 この問題について調べたところ、.NET Framework SDKのサンプルソース中に、以下のようなコメントを見つけました。

// NOTE: You are dicouraged from using the WeakReference.IsAlive property

// because the object may be killed immediately after IsAlive returns

// making the return value incorrect. If the Target property returns

// a non-null value, then the object is alive and will stay alive

// since you have a reference to it. If Target returns null, then the

// object is dead.

 dicouragedはdiscouragedの書き間違いかもしれませんが、ともかく、IsAliveに頼っては駄目、ということのようですね。

 ちなみに、MagSite1でも「弱い参照」を使っていますが、こちらのソースではIsAliveは使っていなかったので問題なしです。

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2003年
08月
08日
C#で改行を含む長い文字列定数を書く方法
3days 0 count
total 20123 count
【技術雑記】の前のコンテンツ
2003年
07月
17日
1980年代のロマン溢れるCPU Transputerとカミソリのように鋭いプログラム言語Occam
3days 0 count
total 2500 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20030721164030
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.34 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.