我的应用程序只是简单的sendkeys。我的问题是,当我运行我的应用程序时,它用于大约55-65k内存使用,然后当我最小化它到系统托盘,它突然下降到约1-3k内存使用,然后当我再次恢复它,它上升到约6-8k内存使用量。我的问题是如何降低内存使用量,即使我没有最小化我的应用程序?
注意:我试着等待大约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只在需要为其他进程腾出空间时才减少程序的工作集。做不需要的工作只是浪费精力。
实际上,你实际上使用的内存要多得多。虚拟内存。它没有任何成本,它是虚拟的。妥协你的代码以减少不花钱的东西是没有意义的。 65KB的虚拟内存是花生,只占流程可用的3%。
像Windows Internals这样的书很好地了解了在Windows上管理内存的方式。
答案 1 :(得分:0)
应用程序以这种方式使用内存是正常的。
当您最小化应用程序时,系统会向内存管理器发送一个信号,尝试释放尽可能多的内存。
通常,应用程序不会尝试最小化分配的内存,因为这只是浪费时间。拥有大量的可用内存不会使计算机运行得更快,相反它只会毫无理由地做很多工作。如果你需要内存,内存管理器会尝试释放它。
为了完整起见,我应该提到你可以通过强制垃圾收集来使应用程序使用更少的内存,但这是毫无意义的,通常被认为是不好的做法。