VB.NET內(nèi)存占用解決方法介紹
VB.NET為我們帶來了許多新的應(yīng)用方式和代碼編寫方式,在一定程度上大大提高了編程人員的編程效率。而且其應(yīng)用方式多樣化,靈活性等特點大大吸引著開發(fā)人員。我們今天將會為大家介紹VB.NET內(nèi)存占用的相關(guān)解決方法,幫助大家解決一些實際開發(fā)中的問題。
VB.NET內(nèi)存占用方法一:將窗體隱藏或者最小化啟動(這個方面是大家根據(jù)經(jīng)驗得出來的)
下列VB.NET 2005代碼片斷通過窗體變量m_IsHide來控制是否將窗體最小化并隱藏,初始化為True。
為了運行下列代碼,還需要一個NotifyIcon及一個與之關(guān)聯(lián)的ContextMenuStrip,后者包含mnuShow和mnuHide菜單兩枚。
- Private m_IsHide As Boolean = True
- Private Sub frmMain_Activated() Sub
frmMain_Activated(ByVal sender As
Object, ByVal e As System.EventArgs)
Handles Me.Activated- If m_IsHide Then
- Me.WindowState = FormWindowState.
Minimized- Me.Hide()
- Else
- Me.WindowState = FormWindowState.
Normal- Me.Show()
- End If
- End Sub
- Private Sub frmMain_Resize() Sub
frmMain_Resize(ByVal sender As Object,
ByVal e As System.EventArgs)
Handles Me.Resize- If Me.WindowState = FormWindowState.
Minimized Then- m_IsHide = True
- Me.Hide()
- End If
- End Sub
- Private Sub mnuShow_Click() Sub
mnuShow_Click(ByVal sender As
System.Object, ByVal e As System.
EventArgs) Handles mnuShow.Click- m_IsHide = False
- Me.WindowState = FormWindowState.Normal
- Me.Show()
- End Sub
- Private Sub mnuHide_Click() Sub
mnuHide_Click(ByVal sender As System.
Object, ByVal e As System.EventArgs)
Handles mnuHide.Click- m_IsHide = True
- Me.WindowState = FormWindowState.Minimized
- Me.Hide()
- End Sub
上述代碼的功能是:#t#
1、 啟動時最小化并隱藏
2、 點擊mnuHide窗體隱藏
3、 點擊mnuShow窗體恢復(fù)
4、 最小化時窗體隱藏
一句話,其實就是編程使窗體啟動時最小化。
VB.NET內(nèi)存占用方法二:Windows將程序占用的內(nèi)存倒入虛擬內(nèi)存可以造成小內(nèi)存占用的假象。
樂天居上有篇文章“將物理內(nèi)存的占用挪到虛擬內(nèi)存里-----揭密篇 ”對此有完整的介紹:“而是操作系統(tǒng)本身就有這個機制,即當程序不使用時(最小化),操作系統(tǒng)會調(diào)用某些命令,來將該程序占用的內(nèi)存移至虛擬內(nèi)存,只保留一小部分常規(guī)代碼”
- BOOL SetProcessWorkingSetSize(
- HANDLE hProcess,
- SIZE_T dwMinimumWorkingSetSize,
- SIZE_T dwMaximumWorkingSetSize
- );
“將 2個 SIZE_T 參數(shù)設(shè)置為 -1 ,即可以使進程使用的內(nèi)存交換到虛擬內(nèi)存,只保留一小部分代碼。
事實上,使用該函數(shù)并不能提高什么性能,也不會真的節(jié)省內(nèi)存。因為他只是暫時的將應(yīng)用程序占用的內(nèi)存移至虛擬內(nèi)存,一旦,應(yīng)用程序被激活或者有操作請求時,這些內(nèi)存又會被重新占用。如果你強制使用該方法來 設(shè)置程序占用的內(nèi)存,那么可能在一定程度上反而會降低系統(tǒng)性能,因為系統(tǒng)需要頻繁的進行內(nèi)存和硬盤間的頁面交換。”
給出我在vb2005中的使用范例:
- Imports System.Runtime.InteropServices
- Module modMain Module modMain
- < DllImport("kernel32.dll")> _
- Public Function SetProcessWorkingSetSize()
Function SetProcessWorkingSetSize( _- ByVal hProcess As Integer, _
- ByVal dwMinimumWorkingSetSize As Integer, _
- ByVal dwMaximumWorkingSetSize As Integer) _
- As Integer
- End Function
- < DllImport("kernel32.dll")> _
- Public Function GetCurrentProcess()
Function GetCurrentProcess() As Integer- End Function
- Public Sub ReduceMem() Sub ReduceMem()
- SetProcessWorkingSetSize(GetCurrentProcess, -1, -1)
- End Sub
- End Module
使用ReduceMem()函數(shù)的效果很贊,但是不建議經(jīng)常用,我只是在FormLoad時用一下,效果就很好了。
值得一提的是,如果不使用GetCurrentProcess()函數(shù)得到當前Process,而是使用Process.GetCurrentProcess(),則無法有效縮減使用內(nèi)存。
以上就是我們?yōu)榇蠹規(guī)淼腣B.NET內(nèi)存占用的具體解決方案。