主要是我机器上的w3wp 进程有时会占用很大内存,这时asp.net就不工作了,我需要它达到一定内存大小时就终止它。
比如w3wp 进程达到200M内存时就终止它。

解决方案 »

  1.   

    VB监控进程并终止进程苦于网吧有人开pplive,qqdownload等占带宽软件,导致整个网吧几乎卡掉,
    于是想写一个监控进程,并自动关闭一些此类软件的程序。
    组成:一个saft.exe,一个close_id.txt(用于保存要杀的进程,方便随时添加编辑)
    以下是代码:
    Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * 1024
    End Type
    Const TH32CS_SNAPHEAPLIST = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPTHREAD = &H4
    Const TH32CS_SNAPMODULE = &H8
    Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Const TH32CS_INHERIT = &H80000000
    Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long'查找进程的函数
    Private Function fun_FindProcess(ByVal ProcessName As String) As Long
    Dim strdata As String
    Dim my As PROCESSENTRY32
    Dim l As Long
    Dim l1 As Long
    Dim mName As String
    Dim i As Integer, pid As Long
    l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If l Then
    my.dwSize = 1060
    If (Process32First(l, my)) Then
    Do
    i = InStr(1, my.szExeFile, Chr(0))
    mName = LCase(Left(my.szExeFile, i - 1))
    If mName = LCase(ProcessName) Then
    pid = my.th32ProcessID
    fun_FindProcess = pid
    Exit Function
    End If
    Loop Until (Process32Next(l, my) < 1)
    End If
    l1 = CloseHandle(l)
    End If
    fun_FindProcess = 0
    End Function
     
    Private Sub Form_Load()
    App.Title = "" '在任务管理器的应用程序中隐藏这个程序
    End Sub
     
    Private Sub Timer1_Timer() '定时器每一分钟动作一次
    Dim uid$
    Open App.Path "\close_id.txt" For Input As #1 '记事本close_id.txt上每行一个你要关闭的程序名
    Do While Not EOF(1) '历遍每行
    Line Input #1, uid
        If fun_FindProcess(uid) <> 0 Then '调用上面的函数判断是否存在这个进程,有则杀
            Shell ("cmd /c taskkill /f /im " & uid), vbHide
        End If
    Loop
    Close #1
    End Sub
       
     
    博客网版权所有 
     
      

  2.   

    http://hbos.bokee.com/viewdiary.28584431.html
      

  3.   

    貌似楼主问题的关键在于:怎么判断w3wp占用的内存超过200M?能解决这个问题,其他的都很简单了
      

  4.   

    用进程加入JOB,然后限定其使用的虚拟内存大小,超过即KILL!
      

  5.   

    这是IIS的进程,你可以直接设置对工作进程(就是你的那个W3WP)内存,CPU资源等的管理.还能设定定时回收,比如1小时....
      

  6.   

    Dim objWMIService As Variant
    Dim strName As String
    Dim strSize As StringPrivate Sub Form_Load()
        Timer1.Enabled = False
        Timer1.Interval = 3000
        Command1.Caption = "開始監控"
        
        strName = "w3wp.exe"
        strSize = CStr(200# * 1024 * 1024)
        Set objWMIService = GetObject("winmgmts:")
    End SubPrivate Sub Command1_Click()
        If Command1.Caption = "開始監控" Then
            Timer1.Enabled = True
            Command1.Caption = "停止監控"
        Else
            Timer1.Enabled = False
            Command1.Caption = "開始監控"
        End If
    End SubPrivate Sub Timer1_Timer()
        For Each objItem In objWMIService.ExecQuery _
        ("Select * from Win32_Process Where Name='" & strName & "' And WorkingSetSize>=" & strSize)
            objItem.Terminate
        Next
    End Sub
      

  7.   

    修改一下
    Dim objWMIService As Variant
    Dim strWQL As StringPrivate Sub Form_Load()
        Timer1.Enabled = False
        Timer1.Interval = 3000
        Command1.Caption = "開始監控"    strWQL = "Select * from Win32_Process Where Name='" & "w3wp.exe" & "' And WorkingSetSize>=" & CStr(200# * 1024 * 1024)
        Set objWMIService = GetObject("winmgmts:")
    End SubPrivate Sub Command1_Click()
        If Command1.Caption = "開始監控" Then
            Timer1.Enabled = True
            Command1.Caption = "停止監控"
        Else
            Timer1.Enabled = False
            Command1.Caption = "開始監控"
        End If
    End SubPrivate Sub Timer1_Timer()
        For Each objItem In objWMIService.ExecQuery(strWQL)
            objItem.Terminate
        Next
    End Sub
      

  8.   

    WMI的并不能使用所有系统 我的系统现在就是用不了 WMI对象的如果批处理可用 我觉得用批处理+vb的组合做会比较简单 内存大小也轻松获得
      

  9.   

    IIS貌似自己有此类管理回收机制吧- -!
      

  10.   

    Public Function processkill(testok As Boolean, killprocess As String) As Boolean
    Dim m As Integer
    Dim temindex As Integer
    Dim jcid As Double
    Dim mProcID As Long
    Dim excelb As Boolean
    excelb = False
    dolistIf lvwPrss.ListItems.Count = 0 Then
        Exit Function
    End Iftemindex = 0
     For m = 1 To lvwPrss.ListItems.Count
     On Error GoTo e
        If LCase(Trim(lvwPrss.ListItems(m).SubItems(1))) = LCase(killprocess) Then
            If temindex = 0 Or temindex < CInt(lvwPrss.ListItems.Item(m).Index) Then
                'lvwPrss.ListItems.Item(m).Checked = True
                temindex = CInt(lvwPrss.ListItems.Item(m).Index)
                jcid = CDbl(lvwPrss.ListItems.Item(m).Text)
                excelb = True
             End If
            If testok = True Then
                mProcID = OpenProcess(1&, -1&, jcid)
                TerminateProcess mProcID, 0&
                DoEvents
                lvwPrss.ListItems.Remove (temindex)
                lvwPrss.Refresh
                If excelb = True Then processkill = True
            End If
        End If
    Nexte:
    End Function