none
VB2008 關於視窗開啟關閉後 記憶體如何完全釋放? RRS feed

  • 問題

  • 請教各位大大 ,小弟最近發現 所寫的程式在連續直行一段時間後 會因整個程式記憶體變得太大而造成LOG

    目前懷疑是所開啟的視窗關閉後,記憶體沒有跟著釋出!所以小弟新開一個測試專案如下

    Form1 建立一個Button 呼叫form2

    Form2 建立15各button ,u Button13 關閉form2

    Imports System.Threading
    
    Public Class Form1
      Dim myResetEvent As New AutoResetEvent(True)
      Public FactorialThread As System.Threading.Thread
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf TEST), myResetEvent)
      End Sub
      Private Sub TEST()
        Do
          For ii As Integer = 1 To 10
            If ii <> 10 Then
              Select Case ii
                Case 1
                  For x As Integer = 0 To 3000
                  Next
                Case 2
                  For x As Integer = 0 To 3000
                  Next
                Case 3
                  For x As Integer = 0 To 3000
                  Next
                Case 4
                  For x As Integer = 0 To 3000
                  Next
                Case 5
                  For x As Integer = 0 To 3000
                  Next
                Case 6
                  For x As Integer = 0 To 3000
                  Next
              End Select
            End If
            'System.Threading.Thread.Sleep(100)
          Next
        Loop
      End Sub
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form2.ShowDialog()
      End Sub
    End Class
    
    Public Class Form2
      Private Sub Button13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click
        Me.Close()
      End Sub
    
      Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Me.Dispose()
        GC.Collect()
      End Sub
    End Class
    

    發現如果單用Me.Close 則記憶體會一直持續往上累積 約30K 但是加入 Me.Dispose()後 ,則是以2-3K 慢慢累增!

    因此請教各位大大 要如何才能將記憶體釋放完全


    新手上路
    2011年1月27日 上午 08:22

解答

  • VB有個奇怪的特性, 基本上它會先將每個Form建一個Instance, 這就是你之所以可以直接使用Form2.Show的原因 (不過我想這你應該知道了)

    使用 Dispose會立刻標註此Instance為非使用狀態 , 但不表示它的記憶體會馬上釋放, 除非像你手動呼叫GC.Collect()

    那一般沒有Dispose的話, CLR會去檢查該Instance是否還有被參考到, 如果沒有, 它就會進行標註為非使用狀態的動作.

    至於CLR啥時會釋放記譯體, 基本上是CLR自己決定的.

    再來對於你的問題, 有幾個地方要注意

    (1) 是否有使用到 Unmanaged 的物件, 因為此類物件就要注意其本身對於記憶體管理的設計是否良好, 因為CLR是管不到的

    (2) 如果有很多你很多自己寫的自訂類別, 最好都實作IDisposable 介面, 並且在使用完該類別的Instance後即呼叫Dispose()

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 eblue 2011年1月28日 上午 04:04
    2011年1月27日 上午 08:39
    版主

所有回覆

  • VB有個奇怪的特性, 基本上它會先將每個Form建一個Instance, 這就是你之所以可以直接使用Form2.Show的原因 (不過我想這你應該知道了)

    使用 Dispose會立刻標註此Instance為非使用狀態 , 但不表示它的記憶體會馬上釋放, 除非像你手動呼叫GC.Collect()

    那一般沒有Dispose的話, CLR會去檢查該Instance是否還有被參考到, 如果沒有, 它就會進行標註為非使用狀態的動作.

    至於CLR啥時會釋放記譯體, 基本上是CLR自己決定的.

    再來對於你的問題, 有幾個地方要注意

    (1) 是否有使用到 Unmanaged 的物件, 因為此類物件就要注意其本身對於記憶體管理的設計是否良好, 因為CLR是管不到的

    (2) 如果有很多你很多自己寫的自訂類別, 最好都實作IDisposable 介面, 並且在使用完該類別的Instance後即呼叫Dispose()

     

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 eblue 2011年1月28日 上午 04:04
    2011年1月27日 上午 08:39
    版主
  • 我會定時呼叫

    GC.Collect()


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年1月27日 上午 09:44
  • 謝謝2位大大的建議!所以說如果我全域的變數用的越多!在form Close後,由於該變數會影響到其他頁面數值!所以記憶體才會一直沒被釋放,一直累計上去!

    關於bill大 提到的第2點!小弟不清楚它的意思!可否舉個例子讓小弟明白一點呢? 謝謝


    新手上路
    2011年1月28日 上午 04:14
  • 你可以參考一下 [IDisposable 介面 ]

    另外我找到一篇文章讓你參考如何找出記憶體使用的問題, 你可以藉由這個文章說明的方式試試看

    http://www.dotnetfunda.com/articles/article625-best-practices-no-5--detecting-net-application-memory-leaks-.aspx


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年1月28日 上午 09:07
    版主