我正在使用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
这是正常还是我做错了什么?
答案 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美元。拿一大粒盐,因为我可能完全偏离基地。
编辑:我原本忘了提到你的线程是醒着还是睡觉都没关系。除非系统内存不足,否则它不会打开睡眠线程的内存,即使那时谁知道它使用了什么算法(如果内存不足,它也可能会分页运行线程...) 。此外,即使它被分页,它仍将显示为使用的内存(虽然你说这是物理内存测量,它可能会显示在其他地方)。