2009-04-28 7 views
2

Windows Vistaでは約40MBのプライベートメモリを使用する中規模のプロセスビューアがあります。問題は、人々が常にProcess Explorerと同様の管理されていないツールで使用されるメモリの量とこの数値を比較することです。.NETアプリケーションのスレッド数を減らす

  • 一つRPCスレッド(RPCRT4.DLL ThreadStartRoutine!)
  • ワンCOM関連のスレッド(OLE32.DLL:

    私は私のプログラムがアイドル状態のときに、13件の実行中のスレッドがあることに気付きました! CoRegisterSurrogateEx + 0x35e0)

  • 二NTDLLスレッド(ntdll.dllの!TppWorkerThread、ntdll.dllの!TppWaiterpThread)
  • メインGUIスレッド
  • CLRが使用するタイマースレッド()
  • ゲートスレッド(CLR)
  • デバッガスレッド(CLR)
  • 4ワーカースレッド(のMscorwks.dll!スレッド:: intermediateThreadProc)
  • そして最後にGDI +バックグラウンドスレッド(GDIPLUS.DLL!BackgroundThreadProc)を

スレッドスタックメモリ(各1MB)を解放するには、どうすればこれらのスレッドを取り除くことができますか? ThreadPool.GetAvailableThreadsは、実行中のワーカースレッドが0であるが、3つの "intermediateThreadProc"スレッドがあることを示しています。サービスマネージャAPIを使用すると、RPCスレッドと何か関係がありますか? (それはRPCコールを行います)。

+0

13のスレッドを参照してくださいには、この懸念を駆動している何 –

+0

私には過度の音はありませんか?ネイティブ実装と比較して、同じまたは少ないメモリ使用量を持つ管理対象プロセスモニタを作成したいですか? –

+0

はい、それは私がしたいことです。ネイティブ実装で使用されているメモリと同程度かそれ以下ではありますが、確かに40MBではありません。それはかなりのメモリです。プロジェクトはhttp:// processhackerにあります。あなたが本当に知りたいのであればsourceforge.net。 – wj32

答えて

2

13スレッドはかなり低いです。残念ながら、これらのスレッドのほとんどを機能を切断することなく取り除くことはできません。

RPC &を取り除くことは、管理されたアプリケーションでは不可能である可能性が高く、CLRスレッドはすべて役に立つ何かをしているようです。私はあなたがGDI +を(おそらくSystem.Drawing経由で)使用していると推測しています。実行中のワーカースレッドが0であっても、スレッドプールにはスレッド「待機中」があり準備ができています。アイドル状態のプロセスで新しいスレッドを作成するオーバーヘッドが発生するように作業項目を投稿することは望ましくありません。

40 MBのプライベートメモリを使用している可能性がありますが、これはスレッドの数が原因ではありません。各スレッドが完全に1MBのデフォルトスタックを使用していても(ほとんどのスタックは予約済みですがコミットされていないため、プライベートバイトとして表示されません)、40 MBのわずか13 MBですあなたは見ています。 CLR Profilerを使用してアプリケーションの割り当て状況を確認できますか?

+0

答えをありがとう。メモリの使用に問題がある場合は、別の質問で質問します。 :) – wj32

2

注:デフォルトオプションのスレッドは、スタック領域に1MBの仮想メモリを予約します。そのメモリはすべて自動的にコミットされません。

代わりに、スレッドがコミットされた領域の端をちょうど通過した場合、すべての仮想空間が使い果たされるまで別のページが自動的にコミットされます。ほとんどの場合、それぞれが1MB未満のものを使用しています。

http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

関連する問題