【发布时间】:2009-04-28 01:25:51
【问题描述】:
我有一个中等大小的进程查看器,它在 Windows Vista 上使用了大约 40MB 的私有内存。问题是人们总是将这个数字与 Process Explorer 和类似的非托管工具使用的内存量进行比较。
我注意到当我的程序空闲时,有 13 个正在运行的线程:
- 一个 RPC 线程 (RPCRT4.dll!ThreadStartRoutine)
- 一个与 COM 相关的线程 (ole32.dll!CoRegisterSurrogateEx+0x35e0)
- 两个 ntdll 线程(ntdll.dll!TppWorkerThread、ntdll.dll!TppWaiterpThread)
- GUI 主线程
- 定时器线程(由 CLR 使用)
- 门线程 (CLR)
- 调试器线程 (CLR)
- 4 个工作线程 (mscorwks.dll!Thread::intermediateThreadProc)
- 最后是 GDI+ 后台线程 (gdiplus.dll!BackgroundThreadProc)
我怎样才能摆脱其中一些线程,释放线程堆栈内存(每个 1MB)? ThreadPool.GetAvailableThreads 告诉我有 0 个工作线程正在运行,但有 3 个“intermediateThreadProc”线程。使用服务管理器 API 是否与 RPC 线程有关? (它进行 RPC 调用。)
【问题讨论】:
-
13 个线程对我来说听起来并不过分
-
是什么导致了这种担忧?与本机实现相比,您想创建一个内存占用相等或更少的托管进程监视器吗?
-
是的,这就是我想做的。不等于或小于本机实现使用的内存,但肯定不是 40MB。这是相当多的内存。如果您真的想知道,该项目位于processhacker.sourceforge.net。
标签: c# multithreading memory