C#とガベージコレクション

私が今のところ理解していない.NETのガベージコレクションには秘密が存在する必要があります。 C#WinFormsアプリケーションには、ORマッパーツールを使用して非常に多くのオブジェクトを読み込むダイアログがあります。このプロセスは大量のメモリを消費し、このメモリのほとんどが文字列によって消費されると考えています。このダイアログを開くと、タスクmenagerは900MBのメモリ使用量を表示し、再度クエリを実行するとメモリ不足例外が発生します。うわー。

今度は、アプリケーションを最小限に抑えるために、何らかのタイプのガベージコレクションが行われるというヒントを得ました。これを行い、最大化することで、アプリケーションは10MBしか消費しません。クール。

しかし、今度は再びクエリを実行すると、メモリ消費量が突然900MBに戻り、メモリ不足例外が再度発生します。

ここで何が起こり、どのようにメモリ消費量を減らすことができますか?そのような場合、どのようにメモリ消費量を調査し、削減することができますか?

1
ANTS Memory Profilerなどのツールを使用して、どのオブジェクトが非常に多くのメモリを占有しているのか確認しましたか?
追加された 著者 Mike Christensen,
タスクマネージャの奇妙な点については、次の質問をご覧ください。 stackoverflow.com/questions/2031577/can-memory-be-cleaned-up‌ /…
追加された 著者 C. Dragon 76,
あなたはあなた自身の質問に答えました。
追加された 著者 John Saunders,
タスクマネージャはこれを診断する正しいツールではありません 。
追加された 著者 Henk Holterman,
あなたのコードを洞察することなく、これは無意味な質問です。それよりも900 MB相当のテキストを読み込んだ方がコストがかかります。あなたが(多くの)負荷を少なくしたら、何か間違ったことをしている。
追加された 著者 Henk Holterman,
あなたがここで何を求めているのか分かりません。メモリ使用量を減らそうとする場合、明白なアプローチは、(クエリなどの)多くのメモリを消費することをしないことです。 900 MBのオブジェクトを割り当てると、900 MBのメモリが<�何とか利用できるようになります。
追加された 著者 delnan,
この問題は、単一の属性をマッピングすることによって多くのメモリを消費する、使用されるORマッパーである可能性があります。私たちは今のところANTSを使用していませんが、Visual Studioのパフォーマンスウィザーズだけは本当に役に立ちません。
追加された 著者 Peter Buchmann,
@HenkHolterman:はい。何かが間違っていて、900MBのデータを読み込まないようにするには、タスクマネージャが表示する900MBのデータはORマッパーで使用される文字列でなければならないが、一時データなのでガベージコレクタは何らかの形でアップ。
追加された 著者 Peter Buchmann,

2 答え

あなたのすべてのループが完了していますか?私は、デスクトップアプリケーションのリソースにあった最大の問題は、ループが止まってしまったり、正常に終了しなかったりすることを知っています。あなたの質問が正しく戻ってきていますか?

あなたはそれ以上のことをしていますか?私はすべてのプロセスが正しく開始し、正しく終了していることを確認します。

0
追加された
このORマッパーを使用していますが、通常は非常にうまく動作します。この場合、何かが間違っています。オブジェクトをロードして、Linqを使用してそれらの間の関連付けを作成します。
追加された 著者 Peter Buchmann,

There are a bunch of .Net Memory Profilers available to help diagnose issues like this. My favorite is dotTrace by JetBrains

0
追加された
メモリプロファイラで解決できるのは本当に問題でした。それは文字列とは関係がありませんでしたが、コードではそれほど簡単ではなかった加入者の広範な使用でした。
追加された 著者 Peter Buchmann,