【问题标题】:Reducing the amount of threads in a .NET application减少 .NET 应用程序中的线程数量
【发布时间】: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


【解决方案1】:

13 个线程相当少。不幸的是,如果不削减功能,您将无法摆脱大部分这些线程。

对于托管应用程序来说,摆脱 RPC 和 COM 很可能是不可能的,而且 CLR 线程似乎都在做一些有用的事情。我猜您正在使用 GDI+(可能通过 System.Drawing。)即使有 0 个工作线程正在运行,线程池也有线程“处于待机状态”,准备启动。您不希望发布工作项必须承担在空闲进程中创建新线程的开销。

即使您可能正在使用 40 MB 的私有内存,这很可能不是因为线程数。即使每个线程都完全使用了它的 1 MB 默认堆栈(它们肯定不是,大部分堆栈被保留但未提交并且不会显示为私有字节),也只是 40 MB 中的 13 MB你看到了。您能否使用 CLR Profiler 查看您的应用程序正在执行哪些分配?

【讨论】:

  • 感谢您的回答。如果我有任何内存使用问题,我会在另一个问题中询问它们。 :)
【解决方案2】:

注意:使用默认选项的线程会为堆栈空间保留 1MB 的虚拟内存。但是,所有这些内存都不会自动提交。

相反,如果线程刚刚到达已提交空间的边缘,则会自动提交另一个页面,直到所有虚拟空间都用完为止。最有可能的是,每个使用的空间都少于 1MB。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 2023-04-07
    • 2019-05-30
    • 2021-10-15
    • 2010-09-13
    • 1970-01-01
    • 2018-03-06
    • 2021-04-04
    相关资源
    最近更新 更多