VMの使用に関する詳細情報を取得するための.NETAPIはありますか?私は自分のアドレス空間がどれほど断片化されているかを判断することに特に興味があります。
ありがとう!
VMの使用に関する詳細情報を取得するための.NETAPIはありますか?私は自分のアドレス空間がどれほど断片化されているかを判断することに特に興味があります。
ありがとう!
簡単な答え:いいえ。そのためには、Win32APIを利用する必要があります。ただし、どのAPI呼び出しを使用するかは本当にわかりません...
http://www.pinvoke.netで簡単に検索すると、次のようになります。
[DllImport("coredll.dll", SetLastError=true)]
static extern void GlobalMemoryStatus(ref MEMORYSTATUS lpBuffer);
ただし、MEMORYSTATUS構造体には、必要なすべての情報(物理メモリと仮想メモリの使用量およびその他の情報)が含まれていないようです。
必要な方法を見つけるためにMSDNを掘り下げる必要があります。
これについての洞察を得ることができるWindowsAPI関数の種類は、仮想メモリセクションを列挙して未使用スペースを検出するVirtualQueryEx()、プロセス内で作成されたヒープを検出するGetProcessHeaps()、およびブロックがどのようにブロックされるかを検出するHeapWalk()です。各ヒープが使用されます。
これは簡単なことではありません。特にHeapWalk()は、実行中のプログラムで厄介な関数です。SysInternalsのVMMapユーティリティを確認する必要があります。これは、優れた仮想メモリ診断を提供します。
これの欠点は、メモリの断片化の問題を解決するのに実際には役立たないということです。Windowsメモリマネージャが仮想メモリ空間をサブ割り当てする方法に影響を与えるためにできることは何もありません。メモリを割り当てないことからショート。OOMで苦労している場合は、アプリの再構築を検討する必要があります。または、64ビットオペレーティングシステムに切り替えると、200ドルのソリューションになります。
異なるCLRホストが異なるもの(通常のアプリケーションホストやSQL Serverなど)を処理する可能性があるため、このような呼び出しはマネージドの世界では意味がありません。また、GCは物事を移動できることを忘れないでください。そうすれば、断片化は実際には問題になりません。GCはヒープを圧縮します。
ただし、これにより次のポイントに進みます。CLRを自分でホストすることで、この情報を取得できるはずです。このトピックに関するこのブログ投稿をご覧になることをお勧めします。
この情報をページレベルで取得するには、実際にWin32 /Win64APIにアクセスする必要があります。さらに詳細に説明すると、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()が必要になることがあります。その場合、すべてのヒープを通過するために2番目のループが必要です。なぜ彼らが複数になるのか分かりませんが。
あなたの場合、おそらくブロックの数とそのサイズを数える必要があります。それをディスクに保存する場合は、最初にブロック数をカウントし、すべての情報を保存するためにバッファーを割り当ててから、後で確認できるようにバッファーをファイルに保存することをお勧めします。