OK、ASP.NET エキスパートの皆さん: リフレクターを使用して ASP.NET キャッシュの実装 (上にHttpRuntime.Cache
あり、HttpContext.Current.Cache
) をHashtable
内部で使用してキャッシュを保持しています。
ただし、データはアンマネージ メモリに格納されます。アンマネージ メモリにデータが格納されているのを確認できなかったので、これは非常に奇妙です。ただし、バイト配列のチャンクをキャッシュに挿入する非常に単純な Web アプリケーションを作成すると、次のようになります。
- プライベート バイト: 460MB
- 全ヒープのバイト数: 150MB
=>
管理メモリ: 150 MB
アンマネージド メモリ: 310 MB
したがって、基本的に私はアプリケーションを何度も呼び出しています (それぞれの増加は 1000x リクエストで、それぞれ 64KB の空のバッファbyte[]をキャッシュに入れます)。そのため、最も大きくなったのは、すべてのヒープ(マネージ メモリ)内のバイトではなく、プライベート バイト(合計メモリ) です。ただし、Hashtable を使用してマネージ ヒープにオブジェクトを追加しているため、マネージメモリは総メモリ量に合わせて増加すると予想しています。
この振る舞いを説明していただけますか?
アップデート
サイモンが言ったように、すべてのヒープ値のバイトはガベージ コレクションの後にのみ変更されます。コードを変更してガベージ コレクションを誘導し、カウンターを更新しました。Gen 2 ヒープ メモリの増加は、追加されたメモリの量とまったく同じです。ただし、アンマネージ メモリは依然としてはるかに高くなっています。この例では、合計メモリが 231 MB であるのに対し、ヒープ 2 はわずか 96 MB でした。