• 如何釋放記憶體

說明

    這是個很常見的的小工具,當電腦使用一段時間由於某些記憶體並未釋放,會使的電腦效率降低,網路上常見到這方面的工具,可是都沒有人教這該如何做,我有寫過幾封信給某些程式的作者;可是不是沒下文,就使跩的二五八萬後還是不肯講,不然就是騙我我要用一些很低階的API什麼的...
    我分析過了,並沒有,可是又懶得去反組譯....
     碰巧這學期有修作業系統,雖不是講Windows,書上提到作業系統本身有在記體體間轉移轉移的功能的,這給了我點靈感,我要迫使系統釋放,於是我做了以下實驗

      Private Sub Command1_Click()
      Me.Caption = "Begin"
      Dim i As Long, s() As Byte
      i = CLng(Text1.Text) * 1024 * 1024
      ReDim s(i)
      Erase s
      Me.Caption = "End"
      End Sub

    我不斷修改Text1的值 10,20,30,50,80...以產生一個很大的陣列,然後釋放這個陣列執行結束後我發現可用記憶體不斷增加,沒錯,我的實驗成功了,較完整了程式如下,如果您有更好的做法也歡迎提供給我.

程式

    '這個程式需要四個Label,一個TextBox,一個Timer,一個Command
    Private Type MEMORYSTATUS
            dwLength As Long 'MEMORYSTATUS結構大小
            dwMemoryLoad As Long '系統記憶體工作負荷的估計 介於0~100間 _
            這個值只供比較用 95/98 NT演算法都不同 將來也可能改
            dwTotalPhys As Long ' 實體記憶體大小
            dwAvailPhys As Long ' 剩餘的實體記憶體
            dwTotalPageFile As Long '記憶體頁可儲存的位元組數
            dwAvailPageFile As Long '剩餘記憶體頁大小
            dwTotalVirtual As Long '每個處理程序可用位址大小
            dwAvailVirtual As Long
    End Type
    Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
    Dim lpBuffer As MEMORYSTATUS
    Dim lTotalMem As Long

    Private Sub Command1_Click()
    Me.Caption = "開始釋放記憶體"
    Timer1.Enabled = False
    Command1.Enabled = False
    Dim i As Long, s() As Byte
    i = CLng(Text1.Text) * 1024 * 1024
    ReDim s(i)
    Erase s
    Timer1.Enabled = True
    Command1.Enabled = True
    Me.Caption = "釋放完成"
    End Sub

    Private Sub Form_Load()
    lpBuffer.dwLength = Len(lpBuffer)
    GlobalMemoryStatus lpBuffer
    lTotalMem = lpBuffer.dwTotalPhys \ 1024 \ 1024
    Label1.Caption = "總記憶體大小 = " & lpBuffer.dwTotalPhys & " Bytes"
    Label2.Caption = "可用記憶體大小 = " & lpBuffer.dwAvailPhys & " Bytes"
    Label3.Caption = "剩餘記憶體記憶體 = " & lpBuffer.dwAvailPhys / lpBuffer.dwTotalPhys * 100 & " %"
    Command1.Caption = "釋放記憶體"
    Text1.Text = lTotalMem
    Timer1.Enabled = True
    Timer1.Interval = 1000
    MsgBox "Text1內的值是所要產生的Buffer大小 單位是MB" & Chr(10) & Chr(13) & _
    "預設值是記憶體大小 當然也可以大於這個值" & Chr(10) & Chr(13) & _
    "不過通常會有反效果 建議是使用這個值" & Chr(10) & Chr(13) & _
    "或使用小於這個值的數 多執行幾次"
    End Sub

    Private Sub Timer1_Timer()
    GlobalMemoryStatus lpBuffer
    Label2.Caption = "可用記憶體大小 = " & lpBuffer.dwAvailPhys & " Bytes"
    Label3.Caption = "剩餘記憶體記憶體 = " & lpBuffer.dwAvailPhys / lpBuffer.dwTotalPhys * 100 & " %"

    Label4.Caption = "建議使用" & lpBuffer.dwAvailPhys \ 1000 \ 1000 + 3 & "這個值去釋放"
    End Sub

文件出處

      Honey

VB心得筆記歡迎各位的指教,如果您有任何文章或資料願意提供給我們的,請來信到VBNote

如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆