2013-04-14 15 views
0

我的應用程序只是簡單的sendkeys。我的問題是當我運行我的應用程序時,它用於大約55-65k的內存使用量,然後當我最小化到系統托盤時,它突然下降到大約1-3k的內存使用量,然後當我恢復它時,它上升到約6-8k的內存使用量。我的問題是我怎麼能降低內存使用量,即使我沒有最小化我的應用程序?vb.net內存使用

注:我試圖等待大約3分鐘,看看我的應用程序是否會減少它的內存使用情況,因爲我認爲它只是加載一些組件。但我沒有,我坐在55-65k,如果我不把它最小化。

這裏是我的代碼:

Imports System.Runtime.InteropServices 
Imports System.Threading 
Public Class Form1 
    Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Integer) As Integer 
    Public Declare Sub keybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) 

    Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow"() As IntPtr 
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr 

    Private SearchWindow As String 
    Public Const vbKeyQ = 81 
    Public Const vbKeyW = 87 
    Public Const vbKeyE = 69 
    Public Const vbKeyR = 82 
    Public Const KEYEVENTF_KEYUP = &H2 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     SearchWindow = "MU" 
     Timer1.Enabled = True 
    End Sub 

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
     If Control.IsKeyLocked(Keys.CapsLock) Then 
      Dim ForeGroundHwnd As IntPtr = GetForegroundWindow 
      Dim MySearchWinow As IntPtr = FindWindow(Nothing, SearchWindow) 
      If ForeGroundHwnd = MySearchWinow Then 
       If rbQ.Checked = True Then 
        keybd_event(vbKeyQ, 0, 0, 0) 
        keybd_event(vbKeyQ, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbW.Checked = True Then 
        keybd_event(vbKeyW, 0, 0, 0) 
        keybd_event(vbKeyW, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbE.Checked = True Then 
        keybd_event(vbKeyE, 0, 0, 0) 
        keybd_event(vbKeyE, 0, KEYEVENTF_KEYUP, 0) 
       ElseIf rbR.Checked = True Then 
        keybd_event(vbKeyR, 0, 0, 0) 
        keybd_event(vbKeyR, 0, KEYEVENTF_KEYUP, 0) 
       End If 
      End If 
     End If 
    End Sub 

    Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize 
     Try 
      If Me.WindowState = FormWindowState.Minimized Then 
       Me.WindowState = FormWindowState.Minimized 
       NotifyIcon1.Visible = True 
       Me.Hide() 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

    Private Sub NotifyIcon1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseDoubleClick 
     Try 
      Me.Show() 
      Me.WindowState = FormWindowState.Normal 
      NotifyIcon1.Visible = False 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click 
     Me.Close() 
    End Sub 
End Class 

回答

0

這是正常的應用程序使用內存的方式。

當您最小化應用程序時,系統會向內存管理器發送一個信號,以嘗試釋放盡可能多的內存。

通常,應用程序不會盡量減少分配的內存,因爲這只是浪費時間。擁有大量的可用內存不會使計算機運行得更快,相反,它會無緣無故地完成大量工作。如果你需要內存,內存管理器會嘗試釋放它。

爲了完整起見,我應該提到你可以通過強制垃圾收集來使應用程序使用更少的內存,但這是毫無意義的,而且通常被認爲是不好的做法。

1

當我把它最小化到系統托盤,它突然下降到約1-3k的內存使用情況

顯然,你是一個很老的操作系統上運行。您根本沒有測量內存使用情況,您正在查看程序的工作集。映射到RAM中的虛擬內存頁面的數量。在像XP這樣的舊操作系統上,內存管理器在其主窗口被最小化時積極修剪進程的工作集。這個功能旨在用很少的RAM來擠壓很多進程。 XP只需要64兆字節。

它不是免費的,它需要一段時間才能獲得響應,當它再次獲得前景時,那些被映射出來的頁面需要被重新分頁。這隻會是頁面你的代碼真的需要它,這就是爲什麼這個增長不是那麼大。現代版本的Windows不再擔心這個功能,他們可以指望這些日子有足夠的RAM。當Windows需要爲其他進程騰出空間時,Windows只會減少程序的工作集。做不需要的工作只是浪費精力。

實際上,你實際上使用的是比這更多的內存。虛擬內存。它不需要任何成本,它是虛擬的。妥協你的代碼來減少不花錢的東西是沒有意義的。而65KB的虛擬內存就是花生,只佔流程可用的3%。

一本像Windows Internals這樣的書可以更好地瞭解內存在Windows上的管理方式。