これは私の前の質問のフォローアップの質問です。
前の質問に対するこの回答で示唆されているように、 ProcessExplorerを使用して、アプリケーションが使用しているハンドルのリストを分析し、ハンドル リークを見つけました。
リークしているハンドルのタイプはSectionです。
セクション ハンドルとは正確には何ですか? セクション ハンドルはどこで使用され、セクション ハンドルがリークする原因は何ですか?
コードでメモリ マップ ファイルを使用していません。
これは私の前の質問のフォローアップの質問です。
前の質問に対するこの回答で示唆されているように、 ProcessExplorerを使用して、アプリケーションが使用しているハンドルのリストを分析し、ハンドル リークを見つけました。
リークしているハンドルのタイプはSectionです。
セクション ハンドルとは正確には何ですか? セクション ハンドルはどこで使用され、セクション ハンドルがリークする原因は何ですか?
コードでメモリ マップ ファイルを使用していません。
Mark Russinovich の Inside Windows 2000 (現在は Windows Internals と呼ばれるもの) を引用すると、
Win32 サブシステムがファイル マッピング オブジェクトと呼ぶセクション オブジェクトは、2 つ以上のプロセスが共有できるメモリ ブロックを表します。
したがって、これはメモリ マップド ファイルです。メモリ マップされたファイルを作成し、それを閉じることができなかった場合、リークが発生します。より具体的にするのはかなり難しいです。
問題は、現在のプロセスのスレッド数をカウントする低レベル関数にあることが判明しました。この関数は、
CreateToolhelp32Snapshot
適切に閉じられなかったハンドルを返す API 関数。ただし、これによりセクションハンドルリークが発生する理由はわかりません。
ファイル ハンドルに関連付けられていないメモリ マップド ファイルは、IPC (プロセス間通信) に使用できます。それらを直接使用しない場合は、ユニットまたはコンポーネントの 1 つが何らかの IPC 通信を行っている可能性があります。コンポーネントを使用して別のプロセスに接続し、要求どおりに解放しない可能性が非常に高くなります。
最初に実行するアクションは、 (FastMM4 デバッグ モードを使用して)メモリ リークを追跡することです。これにより、コード内にリリースされていないオブジェクトが確実に見つかります。
ハンドルは一般的にオブジェクトによって割り当てられるため、私の実験では、すべてのメモリ リークを解決するとハンドル リークが解決されます。
メモリ リークがない場合は、すべてのソース コード (サードパーティ ソースを含む) でCreateFileMapping()
対応する をチェックするための呼び出しがいくつかあります。CloseHandle()
.net のセクション ハンドル リークは、Microsoft Hotfix KB2670838 が原因です。この更新プログラムをアンインストールすると、セクション ハンドル リークの問題 (メモリ不足) が修正されます。
Parameter is not valid. at System.Drawing.Image.get_Width()
at System.Drawing.Image.get_Size()