2016-05-26 7 views
5

バックエンドから多くのデータをキャッシュするエンタープライズアプリケーションを設計しています。ユーザーは任意の数のアプリウィンドウを開くことができ、それぞれは独自のデータをロードしてキャッシュします。何らかの形でメモリ消費を管理し、OS全体のパフォーマンスが低下するのを防ぐため、アプリケーションのメモリ占有量を自動的に監視し、必要に応じてキャッシュからデータを削除するキャッシュマネージャを作成することにしました。メモリ消費管理の戦略

したがって、問題は、メモリを解放するときであるかどうかを特定することが難しいことです。現在、私たちは非常に単純なアプローチを採用しています。アプリケーションのメモリ使用量が物理メモリの80%を超えると、キャッシュからデータを取り除きます。

この種の問題に対処するための確立された方法がありますか?

答えて

3

これは基本的に問題ありません。本当に良い戦略はありません。競合する複数のアプリケーションがある場合、これはキャッシュ競合と誤った追い出しにつながる可能性があります。

スレッショルドが低すぎるとキャッシュスペースが浪費されます。それが高すぎる場合は、ファイルキャッシュ、DLLなどのメモリに収まるものはほかにありません。

"利用可能な物理メモリ"とはどういう意味ですか?無料のメモリまたはメモリをインストールしたことを意味しますか?アプリはどのように空きメモリの80%を使用できますか?あなたが使用している定義が不明です。

SQL Serverは、OSがメモリ不足を通知するまでメモリを使用します(「何か」の95%が使用されていると思われます)。

メモリを解放するためにGCを使用したくないのは確かです。それはあなたのキャッシュ全体を日常的に殺します。

キャッシュの内容を完全にディスクに移動することはできますか?または、アプリケーションプロセスによってクエリできる隠しキャッシュサーバープロセスを持つことによって、.NETプロセス間でキャッシュを共有できます。


は、私はあなたのアプリケーションは、(例として)インストールされているRAMの99%を消費した場合、ファイルキャッシュがほとんど空であるため、パフォーマンスが非常に悪いとなりますことを強調したいです。これは、DLLと.NET NGENされたコードでさえ、頻繁にページアウトされることを意味します。

OSとアプリケーションファイルを適切にキャッシュするには1GBが必要になると考えてください。したがって、インストールされているRAMからわずか10%で1GBを引いたものがなくなるまでメモリを消費することができます。

+0

利用可能な物理メモリとは、無料のメモリを意味します。私はタイムリーなオブジェクトの割り振り解除に関してGCを完全に信頼することはできませんが、これまでのところテストでは問題にはなりませんでした。 また、別々のウィンドウは単一のWindowsプロセスでホストされるため、それらの間でキャッシュを共有する心配はありません。 OSが低メモリについてどのように通知しますか?とにかく.Netの信号を傍受することはありますか? –

+0

これにはAPIがあります:https://msdn.microsoft.com/en-us/library/windows/desktop/aa366541(v=vs.85).aspxしかし、Windowsが「低」と考えるものはあなたのものではないかもしれません欲しいです。それは任意の閾値です。 「私たちは空きメモリの最大80%を消費する」と言うなら、そのメモリはもはや空きメモリではありません。その定義は意味をなさない。メモリを消費して分母を変更しています。 – usr

+0

申し訳ありませんが、メモリ使用状況に関する私の悪い。私はその問題でそれを修正した。 –

関連する問題