2016-11-15 7 views
1

ASP.NET MVC(5)アプリケーションのメモリ管理に関する詳細を知りたいと思います。簡単のためMVCアプリケーションのメモリ管理

、ページングが実装されている(だけIEnumerable<CustomItem>の70個の000アイテムを取得するために私api controllerに向けたhttp.get()呼び出しを行い、その後のページに結果を出力する、我々は、角度コントローラと簡単なページを持っているとしましょう)。

私の診断ツール(メモリプロファイラ)を見ると、メモリが50 MB(開始点)から300 MBまで(すべてのデータが取得された後)に上昇することがわかります。ここで

は、私は理解していないものです:私は同時に別のブラウザで同じページを開いたとき(複数のユーザーが同時にページを訪問していることをシミュレートしようとしている)のはなぜ
、 2番目のユーザーのメモリ消費量は250 MB増加しませんが、データが再度読み込まれても同じになります。

私は印象に残っていましたが、ApiControllerはユーザー間で共有されていませんが、すべてのユーザーに対して新しいインスタンスが作成されています。私が正しければ、それは本当に事実です、どのように70 000以上のアイテムが到着したときに、メモリ消費は変化しませんでしたか?

すべての記事または説明は高く評価されます。

追加1:
マイAPIコントローラはSharePointからデータをrerievingされているので、私は後で改ページを実装して、私の角度成分に一度にすべての70件の000レコードを渡す必要があります。言い換えれば、私のコンポーネントはすべてのデータ(70 000レコード)を1回だけロードし、その後はその部分だけを表示します(そうでなければ、ブラウザがフリーズしていた70,000アイテムにdata-ng-repeatを使用した場合)。

実際には、必要ならばApiControllerコードを表示することができますが、実際には3行のコードを持っているIEnumerable<CustomItem>を返します。これは次のようになります。

public class SharepointFile 
{ 
    public string FileType { get; set; } 
    public string FileName { get; set; } 
    public string FilePath { get; set; } 
} 
+1

あなたはどのデータベースを使用していますか?あなたのコントローラのソースコードはどのように見えますか?レコードの平均サイズは?ここで起こっていることを言うのは難しいです。ほとんどのメモリ使用量はアプリケーション自体でありデータではないかもしれませんが、わかりません。 –

+1

詳細情報が必要な場合は、すべてのレコードをメモリにロードしますか?もしページングが正しい方法(データベース側)で実装されていれば、 'IEnumerable 'に70Kのレコードを持っていることはありません。あなたが表示する必要があるもの(現在のページ)があります。サーバ。 – JOBG

+0

あなたが投げている数字から、すべての70kレコードをメモリにロードしているようです。単一のページ付けされたクエリの場合、メモリはそれほど上がるべきではありません。 – user449689

答えて

0

表示されるメモリの増加は、プロセスで使用される実際のメモリです。しかし、.NETは、以前に実行された要求からメモリが解放されている場合、すべてのオブジェクトがガベージコレクトされ、新しく割り当てられますが、さらに多くのメモリを割り当てる必要はありません。通常、プロセスは、OSがそうするように指示されない限り、メモリを解放しません。彼らはメモリ空間の使用を続けます。

各要求後にメモリを解放する必要はなく、CPU使用量が多くなり、オペレーティングシステムレベルでメモリに断片化が多く発生します。

アクティブな.NETオブジェクトの合計サイズとそれらのために予約されているメモリの間には常に違いがあります。

したがって、70kオブジェクトはすべて共有されていませんが、新しいものですが、プロセスには既に空き領域があり、OSからより多くのメモリを要求しません。

+0

これは本当に本当ですか?この場合、どのようにOSにメモリを返すように私のプロセスに伝えることができますか? – user230910

0

あなたのApiControllerをユーザー間で共有することはできますが、なぜそうしますか?これらのmvcアプリケーションはステートレスにされ、要求間でそれらを共有する必要はありません。

メモリ消費量に見られるのは、メモリ内の具体的なオブジェクトとは一致しません。

アプリケーションによってメモリ使用量をプロファイルして、何が格納されているか、どのくらいの量が割り当てられているかを確認できます。 Ants Memory Profiler、またはdotTrace from JetBrainsを試すことができます。あなたが他のものを取り付けることができない場合に備えて、良い古い無料のWinDbgもあります。

また、メモリ管理のトピックは、Webアプリケーションのホスト方法によって異なる場合があります。たとえば、IISでは、アプリケーションプールのメモリ管理に関連する多数のトピックが見つかります。

プロセスエクスプローラのようなツールを使用して、作業サイズと仮想サイズメモリを比較することができます。