任务管理器显示9MB内存使用情况,而执行服务功能的线程正在休眠

时间:2009-01-27 15:39:19

标签: c# multithreading windows-services service

我正在使用VB9(VS2008)开发桌面搜索引擎。

当服务中涉及的唯一线程处于休眠状态时,服务占用9MB内存是否正常?

该代码包括以下导入语句......

Imports System
Imports System.IO
Imports Microsoft.Win32
Imports System.Threading

Service类

中有一些类变量
Private serviceStarted As Boolean = False
Dim workerThread As Thread
Dim DSEKey As RegistryKey
Dim indexFolder As String
Dim tempFolder As String
Dim docFolders As String()
Dim interval As Integer

OnStart方法采用以下形式:

protected override void OnStart(string[] args)
{

   ThreadStart st = new ThreadStart(WorkerFunction);
   workerThread = new Thread(st);

    serviceStarted = true;

    workerThread.Start();
}

WorkerFunction采用以下形式:

private void WorkerFunction()
{

   while (serviceStarted)
   {

      // Desired function - STARTS

      // Desired function - ENDS

      // Close all open objects

      if (serviceStarted)
      {
         Thread.Sleep(new TimeSpan(0, interval, 0);
      }
   }

   Thread.CurrentThread.Abort();
}

Process Explorer将物理内存使用描述为:

Working Set: 9,440 K
    WS Private:   2,356 K
    WS Shareable: 7,084 K
    WS Shared:    6,440 K

这是正常还是我做错了什么?

3 个答案:

答案 0 :(得分:2)

从中我可以看出,内存使用量仅使用大约2.3 MB的实际内存,共享/可共享集合本质上是一个“缓存”内存集合,这意味着应用程序已经指定了它只是需要它

考虑到您确实有许多私有成员会占用一些内存,您的应用程序内存使用率很可能不会那么糟糕。

但是,如果您希望真正优化并确定内存使

答案 1 :(得分:2)

这是由CLR / GC和Windows内存管理器协商内存引起的。 CLR / GC将分配比Windows需要更多的内存,使工作集显得很高。但是,如果Windows内存管理器(在操作系统级别)检测到需要更多内存,它将尝试根据需要从应用程序的进程中获取更多内存。现在,如果要强制该工作集变低,可以尝试将Porcess.MaxWorkingSet属性设置为-1。这指示窗口立即尝试“修剪工作集”到可能的最小内存量。或者,您可以使用相应的Windows API SetProcessWorkingSetSize

然而,缺点是这需要一些更高的权限(FullTrust for Working Set,以及SetProcessWorkingSetSize的Unmanaged / P / Invoke访问),并且CLR可能在下次需要内存时分配内存较慢,因为它必须返回到操作系统获取更多内存。

顺便说一句:您可以在MSDN文档中查看基础对应Windows API SetProcessWorkingSetSize的此行为的证据。请注意以下内容:

  

如果dwMinimumWorkingSetSize和   dwMaximumWorkingSetSize具有该值   (SIZE_T)-1,函数删除为   尽可能多的页面   指定过程的工作集。

答案 2 :(得分:1)

请允许我在前面加上a)我对VB一无所知,b)我对Windows内存模型知之甚少。但是,如果我在linux系统上看到这个,我会说你只需要关心私有内存的使用情况。共享/可共享的东西很可能是由VB(.net?)运行时加载的DLL,而不是问题,因为它们是在应用程序之间共享的。对于VB应用程序来说,2MB似乎并不过分,即使是没有太多数据的应用程序也是如此。如果它是一个C ++应用程序,我会担心,但对于一种解释性语言,我认为它与课程相提并论。我认为它主要是开销,实际上并没有在你的几个变量中分开。此外,您是否正在运行调试或发布版本?这可能会严重影响内存占用。

只需0.02美元。拿一大粒盐,因为我可能完全偏离基地。

编辑:我原本忘了提到你的线程是醒着还是睡觉都没关系。除非系统内存不足,否则它不会打开睡眠线程的内存,即使那时谁知道它使用了什么算法(如果内存不足,它也可能会分页运行线程...) 。此外,即使它被分页,它仍将显示为使用的内存(虽然你说这是物理内存测量,它可能会显示在其他地方)。

相关问题