C# 任务管理器在执行服务功能的线程处于睡眠状态时显示9MB内存的使用情况

C# 任务管理器在执行服务功能的线程处于睡眠状态时显示9MB内存的使用情况,c#,multithreading,windows-services,service,C#,Multithreading,Windows Services,Service,我正在用VB9(VS2008)开发一个桌面搜索引擎 当服务中唯一涉及的线程处于睡眠状态时,服务占用9MB内存是否正常 代码包括以下导入语句 Imports System Imports System.IO Imports Microsoft.Win32 Imports System.Threading 服务类中有几个类变量 Private serviceStarted As Boolean = False Dim workerThread As Thread Dim DSEKey As Reg

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

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

代码包括以下导入语句

Imports System
Imports System.IO
Imports Microsoft.Win32
Imports System.Threading
服务类中有几个类变量

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();
}
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();
}
WorkerFunction采用以下形式:

protected override void OnStart(string[] args)
{

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

    serviceStarted = true;

    workerThread.Start();
}
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();
}
将物理内存使用情况描述为:

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

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

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

考虑到您确实有许多私有成员将占用一些内存,您的应用程序内存使用情况很可能没有那么糟糕


我很可能不会担心它,但是,如果您希望真正优化并确定内存使用的来源,您可以使用RedGate的ANTS Profiler来调查内存中的各个对象。

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

考虑到您确实有许多私有成员将占用一些内存,您的应用程序内存使用情况很可能没有那么糟糕


不过,我很可能不会担心这个问题,如果你想真正优化并确定内存使用的来源,你可以使用RedGate的ANTS Profiler来调查内存中的各个对象。

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

只有我的0.02美元。吃一大粒盐,因为我可能会完全偏离基准


编辑:我忘了最初提到的一点是,你的线程是醒着的还是睡着的并不重要。除非系统内存不足,否则它不会分页出休眠线程的内存,甚至谁知道它使用什么算法(如果内存不足,它也可能分页出正在运行的线程…)。此外,即使它被调出页面,它仍然会显示为已使用的内存(尽管因为你说这是物理内存度量,它可能会显示在其他地方)。

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

只有我的0.02美元。吃一大粒盐,因为我可能会完全偏离基准


编辑:我忘了最初提到的一点是,你的线程是醒着的还是睡着的并不重要。除非系统内存不足,否则它不会分页出休眠线程的内存,甚至谁知道它使用什么算法(如果内存不足,它也可能分页出正在运行的线程…)。此外,即使它被调出,它仍将显示为已使用的内存(尽管您说这是物理内存度量,它可能会显示在其他地方)。

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

但是,缺点是,这需要一些更高的权限(工作集的FullTrust和SetProcessWorkingSetSize的非托管/p/Invoke访问),而且CLR下次需要内存时可能会分配更慢的内存,因为它必须返回操作系统以获取更多内存

顺便说一句:您可以在底层相应的Windows API的MSDN文档中看到这种行为的证据。请注意以下要点:

如果dwMinimumWorkingSetSize和 dwMaximumWorkingSetSize具有以下值: (SIZE_T)–1,该函数将根据需要删除 尽可能多地从 指定进程的工作集


这是由CLR/GC和Windows内存管理器协商内存造成的。CLR/GC将从windows分配超出其所需的内存,从而使工作集看起来较高。但是,如果Windows内存管理器(位于