0

MDI アプリケーション内のメモリ リークを追跡しています。フォームを開いてから閉じると、フォームがメモリに残ります。Ant のメモリ プロファイラーを使用すると、メモリ内にフォームを保持する参照の次のグラフを取得できます。

フォームで Dispose が発生したときに、コンボ コントロールにアタッチするすべてのイベントを削除しました。

誰でも私を解決策に導くことができますか?

C1 名前空間は、ComponentOne に由来します。

C1Combo コントロールの c、r、b などのメソッドがリフレクターを介してどのようなものであるかを確認しようとしたことに注意してください。

Ant のリファレンス グラフ

4

3 に答える 3

2

これは、1.1 年前に .NET で構築した巨大な C# WinForm アプリを思い起こさせます。私は.NET Memory Profilerを使用しましたが、寄生虫を見つけるのに役立ちました。Ant の MP はおそらくそうすることができます。

とにかく、私の場合、使用中に多くの並列スレッドとタイマーが作成されました。犯人は、適切に破棄されなかったタイマーインスタンスであることが判明したため、タイマーが実行されている生成されたスレッドを決して終了しませんでした。

直接回答できるわけではありませんが、たまたまスレッドがいたるところに生成されている場合は、特にスレッドで実行されているものを注意深く監視/処理してください。

私の場合、それはメモリ保持のほうが多いか、ほとんどの人が別のメモリリークであると主張します.

問題の原因がサードパーティのコンポーネントにある場合は、それらを突き止める必要があると思います.

リークの犯人を追跡して頑張ってください!

于 2009-11-12T00:39:51.497 に答える
1

C1 には、内部参照を解放しないというバグがある可能性があります。会社に連絡するか、ナレッジベースを検索してください

サードパーティ コンポーネントの別のセットでは、Telerik コントロールにバグがあり、それを報告したことを覚えています。それらは次のリリースで修正されました。すぐに回避策が提供されることもありました。

于 2009-11-12T00:37:29.113 に答える
0

C1Combo のコントロールへの内部参照まで追跡しました。何らかの理由で、フォームやその他のいくつかへの参照が含まれているリストがあります。フォームの Dispose() で、各 C1Combo コントロールに対してこの関数を呼び出します。結果についてはわかりませんが、コントロールはとにかく処分する必要があるため、おそらく最小限です。

また、新しいバージョンがリリースされ、難読化によってすべてのメソッド/フィールド名が台無しになるかのように、非常に壊れやすく、壊れます。

private void RemoveInternalC1ComboReferenceListHack(C1Combo combo)
    {
        var result = typeof(C1Combo).GetField("_dropDownList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(combo);
        var result2 = result.GetType().GetField("c", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result);
        var result3 = result2.GetType().GetField("r", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result2);
        var result4 = result3.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(result3);

        ((System.Collections.Generic.List<Control>)result4).Clear();
    }
于 2009-11-12T03:31:23.693 に答える