2011-10-27 24 views
3

私のアプリケーションのメモリリークのように見える問題が発生しています(アプリケーションが時間の経過と共にメモリを使用し、約1週間後にメモリがハングします)。メモリリークと脆弱な参照

私が書いたクラスに関連するリークを検出して修正しました(sos.dllで取得したヒープダンプと比較して速やかに明らかにしたものと比較して)。

現在、時間の経過とともに劇的に増加するのは、WeakReferenceのインスタンスであり、一定の割合で1,000分の1秒あたりの増加率が新しいWeakReferenceになります。

私のコードではWeakReferenceを直接使用していません。自分自身を作成することはありません。

非常に多くのWeakReferenceインスタンスが作成される原因は何ですか?私はVB.NETを使用してい

、のVisual Studio 2008と.NET 3.5

+1

ORMを使用していますか? (Entity Framework、Linq-to-SQL、NHibernateなど)あなたのWebアプリケーションはありますか? – xanatos

+2

Microsoftの[CLRプロファイラ](http://www.microsoft.com/download/en/details.aspx?id=16273)を使用して、参照を保持しているものを確認しようとしましたか? –

+0

私のアプリはローカルアプリケーションです(シリアルポートまたはTCPソケットを介して他のデバイスと通信します)。私が使用する唯一のORMはLINQ2SQLです。これは頻繁に使用されていない第2の機能です(ユーザーがその機能を特に呼び出しない限り呼び出されません)。 ORMの部分をテストのためにアプリから完全に切り離して、もしそれがそうであると思えば、私はそれを切り捨てることができます。 –

答えて

8

はい、これはVB.NETのアセンブリではかなり悪名高いリークがあります。これは、WithEventsキーワードで宣言されたイベントを追跡する弱い参照によって引き起こされます。この追跡は編集と継続をサポートするために行われます。これは、クラス内で宣言されたすべてのWithEventsイベントに対してWeakReferenceの1つのインスタンスをリークします。これらのWeakReferenceオブジェクトを解放するには、デバッガをアタッチする必要があります。

回避方法は簡単です。リリースビルドを出荷し、デバッグビルドは出荷しないでください。

+0

これは修正されましたか?また、なぜ、どうやってこれが起こるかについて、さらに詳しく説明することができますか?グーグルリングがこの答えである間に私が現れた唯一の有用なものです。 –