VM の断片化を判断するための .NET API
-
22-09-2019 - |
質問
VM の使用に関する詳細情報を取得するための .NET API はありますか?特に、アドレス空間がどの程度断片化されているかを判断することに興味があります。
ありがとう!
解決
これについて洞察を得ることができる種類の Windows API 関数は、仮想メモリ セクションを列挙して未使用領域を検出する VirtualQueryEx()、プロセス内でどのようなヒープが作成されているかを検出する GetProcessHeaps()、およびブロックがどのようにブロックされているかを検出する HeapWalk() です。各ヒープが使用されます。
これは簡単なことではありません。特に HeapWalk() は実行中のプログラムでは厄介な関数です。SysInternals を見てみる必要があります。 VMMap ユーティリティ, 、優れた仮想メモリ診断を提供します。
これの欠点は、メモリの断片化の問題を解決するのに実際には役に立たないことです。Windows メモリ マネージャーが仮想メモリ領域をサブ割り当てする方法に影響を与えるためにできることは何もありません。メモリが割り当てられていないためショートします。現在 OOM に苦労している場合は、アプリの再構築を検討する必要があります。あるいは、200 ドルのソリューションである 64 ビット オペレーティング システムに切り替えることもできます。
他のヒント
短い答え:いいえ。あなたはそのためのWin32 APIを活用する必要があります。私は本当にあなたが...
かかわらず使用することになり何API呼び出しを知りませんhttp://www.pinvoke.net の上のクイック検索は、これに私を導いた。
[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
しかし、MEMORYSTATUS構造体は、あなたが(ちょうど物理&仮想メモリの使用状況やその他の情報)を必要とするすべての情報を持っていないようです。
あなたが必要な方法を見つけるために、MSDNの周りを掘る必要があります。
このようなコールは、管理の世界で意味がありません。そして、その断片化が本当に問題ではないことを、GCはヒープを圧縮されます。
、GCは周りのものを動かすことができるということを忘れないでくださいしかし、これは次のポイントに私をもたらし、あなたはCLRを自分でホストすることにより、この情報を得ることができる必要があります。あなたは/ <でこのトピックについては、このブログの記事を見てみたいことがありますA>。
この情報をページ レベルで取得するには、Win32/Win64 API を実際に使用する必要があります。さらに詳しく調べるには、C ヒープ、Win32 ヒープ、CLR スモール オブジェクト ヒープ、CLR ラージ オブジェクト ヒープのいずれであっても、調べているヒープの内部動作を知る必要があります。
ただし、使用できます 仮想メモリ検証ツール (商用ですが無料です) 仮想メモリ空間を視覚化し、メモリ空間をページごと、段落ごとに検査します。まずビジュアルを見てください。そうすることで、一般的な問題と傾向が簡単にわかります。次に、どのメモリ領域に問題があるかを特定したら、ページと段落の詳細情報を確認します。
内容を説明したブログ記事は次のとおりです ページと段落 は。
Cでは、割り当てられているどのくらいのメモリを知っているためにこのような何かを書くことができます:
HANDLE heap = GetProcessHeap();
PROCESS_HEAP_ENTRY entry;
memset(&entry, 0, sizeof(entry));
unsigned long size = 0;
while(HeapWalk(heap, &entry)) {
if(entry.wFlags & PROCESS_HEAP_ENTRY_BUSY) {
size += entry.cbData;
}
}
GetProcessHeaps()他のヒープを使用すると、すべてのヒープを通過する第二のループを必要とし、その場合には使用されている場合に必要とすることができます。彼らはしかし、複数のだろう、なぜ私は知らない。
あなたのケースでは、あなたはおそらく、ブロックとそのサイズの数をカウントする必要があります。あなたがディスクにあることを保存したい場合は、私はあなたが最初のブロックの数をカウント示唆し、後で確認するためのファイルのバッファの保存、すべての情報を保存するためのバッファを割り当てます。