0

IIS 6.0 アプリケーション プールは、ページの最初の読み込みで 155Mb のメモリを消費します。その後同じページを更新すると、消費されるアプリ プール メモリは最大で約 245Mb になります。

これは Web フォーム アプリケーションであり、Entity Framework と DevExpress コントロールを使用します。

最初はこれはメモリ リークだと思っていましたが、メモリ プロファイラを使用してさらに調査したところ、アプリ プールによって占有されている領域の半分以上が空き領域であり、断片化されていることがわかりました。

これにより、Large Object Heap メモリの断片化が原因であることがわかりました。実際、約 980Kb の長いリストがあり、特にリストが大きくなり、サイズが変更されてメモリに穴が残る場合に、通常、断片化を引き起こす可能性があります。

したがって、基本的にはリストのリストである複合リストを作成しました。各リストは85000バイト未満になるため、ガベージコレクション後に圧縮される通常のヒープに割り当てられるという考えです(Large Object Heapとは異なり、圧縮されることはありません)

他の人がリストのリストを使用してオブジェクトがラージ オブジェクト ヒープから確実に逃れるようにするために、複合リストがそのトリックを実行することを期待していましたが、この場合、実際の違いはないようで、アプリケーション プールのメモリはまだ約 240Mb ですが、メモリ プロファイラーはドット ネット CLR メモリを約 10Mb と報告しています。

何が起こっているのかを確認するためにメモリダンプを実行する予定ですが、他の誰かが考えられる原因について見解を持っているかどうか疑問に思いました.

4

1 に答える 1

0

あなたが見ているのは、Large Object Heap のブロックを占有する巨大な文字列であることに、かなりの金額を賭けても構わないと思います。これは、あらゆる種類の部分レンダリング スキームに特に当てはまります。ブラウザに配信されます。

私は以前にこの正確な問題に遭遇しましたが、解決策は苦痛でした-基本的に、標準の「コントロール/ビューのすべてのhtml出力を一緒に集約する」アプローチではなく、「ストリーミング書き込み」パスを作成する必要がありました。 (または少なくともそうでした)MVC、WebFormsなどのデフォルトの方法。

幸運を!このルートをたどりたい場合は、Responseストリームを開き、コンテンツが計算されるときにそれらに直接書き込むレンダリング拡張機能のセットを作成することを検討することになります。

于 2013-06-28T17:37:26.840 に答える