Asp classic WMI/ASP内存问题

Asp classic WMI/ASP内存问题,asp-classic,process,wmi,out-of-memory,monitor,Asp Classic,Process,Wmi,Out Of Memory,Monitor,我创建了一个用经典ASP编写的服务器监控脚本(托管在IIS 7.5上) 它有一个主页,使用jQuery自动重新加载内容(更新WMI信息)。它工作得很好,但似乎对内存有兴趣 共有4页(2台服务器的服务状态、主DC上的打印机状态和同一服务器上的磁盘使用情况)。服务状态页每10秒更新一次,打印机每5秒更新一次,磁盘使用情况每分钟更新一次 脚本基本上工作了几个小时,然后我得到了代码500的内部服务器错误,检查了IIS日志,因为它“内存不足”,并查看了服务器上的进程,WmiPrvSvc.exe(网络服务帐

我创建了一个用经典ASP编写的服务器监控脚本(托管在IIS 7.5上)

它有一个主页,使用jQuery自动重新加载内容(更新WMI信息)。它工作得很好,但似乎对内存有兴趣

共有4页(2台服务器的服务状态、主DC上的打印机状态和同一服务器上的磁盘使用情况)。服务状态页每10秒更新一次,打印机每5秒更新一次,磁盘使用情况每分钟更新一次

脚本基本上工作了几个小时,然后我得到了代码500的内部服务器错误,检查了IIS日志,因为它“内存不足”,并查看了服务器上的进程,WmiPrvSvc.exe(网络服务帐户)有数百个(500mb),ISS工作进程(w3wp.exe)使用了大约50mb(还有其他更高级别的w3ps.exe进程)

一旦我结束了它们,它就会重新启动……或者如果我停止页面/请求一段时间(在30秒到5分钟之间变化),WmiPrvScs就会结束,我就不会遇到问题

是否有办法将内存使用降至最低,或者是否有命令正确断开/清除内存

下面是我的一页的基础知识,让你了解正在发生的事情

谢谢你,保罗

<%
    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colListOfServices = objWMIService.ExecQuery("SELECT Caption, Started FROM Win32_Service WHERE StartMode = 'Auto'")

    Set arrServices = Server.CreateObject("System.Collections.ArrayList")


    intServices = colListOfServices.Count

    For Each objService in colListOfServices 
        arrServices.Add objService.Caption & "@" & objService.Started
    Next

    arrServices.Sort()
    Response.Write "<table width=""100%"" class=""tblServices"">" & vbCr
    For Each strService in arrServices
        If InStr(strService, ".NET Framework") = 0 AND InStr(strService, "Sophos Web Intelligence Update") = 0 AND InStr(strService, "Shell Hardware Detection") = 0 Then
            ' Above services, start at system startup and then stop after nothing to do
            arrServiceDetails = Split(strService, "@")
            strServiceName = arrServiceDetails(0)
            strServiceStatus = arrServiceDetails(1)


        End If
    Next

    Response.Write "</table>"

    Set objWMIService = Nothing
    Set colListOfServices = Nothing
    Set arrServices = Nothing   
%>

您是否每10秒调用一次上述代码?
我不确定,但我看起来你每次都在创建一个新的WMI对象/连接,这就增加了。
取而代之的是尽量保持对象的存在,而不是重新创建它。类似于一个单例类来保持连接


另外,尝试创建一个强类型类来代替WMI查询,您可以通过查看此站点来实现这一点:

我认为可能是这样的……因此,最初我编写了一个VB应用程序来代替WMI查询并导出到xml文件,但仍然使用WmiPrvSvc.exe获得高内存使用率,并且再次在大约500mb时停止……然后我使用了生成的类通过你链接到的MGMTClassGen工具,我得到了完全相同的结果。我现在注意到,如果我查询WMI服务,我没有任何问题,但在查询打印机时,这就是我遇到问题的时候……我还在互联网上找到了关于WMI内存泄漏的链接,但在尝试热修复时,它说它不适用于系统im using。