2009-04-28 80 views
2

我有一个中等大小的进程查看器,它在Windows Vista上使用大约40MB的私有内存。问题是人们总是将这个数字与Process Explorer和类似的非托管工具所使用的内存量进行比较。减少.NET应用程序中的线程数

我注意到,当我的程序也是闲着,有13级正在运行的线程:

  • 一个RPC线程(RPCRT4.DLL ThreadStartRoutine!)
  • 一个COM相关的线程(OLE32.DLL! 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线程不健全过多给我 – 2009-04-28 01:28:12

+0

是什么推动这个问题?与本机实施相比,您是否想要创建一个托管进程监视器,它具有相同或更少的内存占用空间? – 2009-04-28 01:42:07

回答

2

13线程是相当低。不幸的是,如果不切割功能,你将无法摆脱大部分线程。

摆脱RPC & COM很可能不适用于托管应用程序,并且CLR线程似乎都在做一些有用的事情。我猜你正在使用GDI +(可能是通过System.Drawing。)即使有0个工作线程正在运行,线程池中的线程仍处于“待机”状态,准备启动。您不希望发布工作项目,以致不得不在闲置过程中创建新线程。

尽管您可能正在使用40 MB的私有内存,但这很可能不是由于线程数量所致。即使每个线程完全使用它的默认堆栈(默认情况下不是1MB),大多数堆栈都是保留的但未提交,并且不会显示为专用字节),即40 MB中只有13 MB你看到了。你可以使用CLR Profiler来查看你的应用程序在做什么分配?

2

一个注意:具有默认选项的线程为堆栈空间保留1MB的虚拟内存。所有这些内存不会自动提交。相反,如果线程刚刚超过已提交空间的边界,则会自动提交另一个页面,直到所有虚拟空间耗尽为止。最有可能的是,每个人使用的都少于1MB。

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

相关问题