這很有趣。我們花了最後一天試圖用以下(遺留)代碼修補問題,這些代碼繼續增加其進程大小。這是在Visual Studio 2003中完成的。這是爲什麼導致內存泄漏?
我們有一個窗體,我們在窗體上顯示一個圖像(來自MemoryStream)以及一些文本和一個按鈕。沒有什麼花哨。看起來像這樣:
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
MyBase.OnLoad(e)
Try
m_lblWarning.Visible = False
m_grpTitle.Text = m_StationInterface.ProcessToolTitle
m_lblMessage.Text = m_StationInterface.ProcessToolMessage
Dim objImage As MemoryStream
Dim objwebClient As WebClient
Dim sURL As String = Trim(m_StationInterface.ProcessToolPicLocation)
objwebClient = New WebClient
objImage = New MemoryStream(objwebClient.DownloadData(sURL))
m_imgLiftingEye.Image = Image.FromStream(objImage)
m_txtAcknowledge.Focus()
Catch ex As Exception
'*** This handles a picture that cannot be found without erroring'
m_lblWarning.Visible = True
End Try
End Sub
此表單經常關閉並打開。每次重新打開時,進程內存使用量將增加大約5mb。當表單關閉時,它不會回退到之前的用法。資源仍然分配給未引用的表單。形式呈現這樣的:
m_CJ5Form_PTOperatorAcknowlegement = New CJ5Form_PTOperatorAcknowlegement
m_CJ5Form_PTOperatorAcknowlegement.stationInterface = m_StationInterface
m_CJ5Form_PTOperatorAcknowlegement.Dock = DockStyle.Fill
Me.Text = " Acknowledge Quality Alert"
'*** Set the size of the form'
Me.Location = New Point(30, 30)
Me.Size = New Size(800, 700)
Me.Controls.Add(m_CJ5Form_PTOperatorAcknowlegement)
控制稍後從模中取出後關閉:
Me.Controls.Clear()
查閱。我們嘗試了很多東西。我們發現Disposing不會做任何事情,並且的確,接口實際上並不會觸及內存。如果我們每次都不創建新的CJ5Form_PTOperatorAcknowledgement表單,則流程規模不會增長。但是,將新圖像加載到該表單中仍然會導致進程大小持續增長。
任何建議,將不勝感激。
「使用」未添加聲明,直到Visual Studio 2005的產權處置是不是這裏的問題。我們已經嘗試過所有對象處理的變化,但都沒有成功。我們也嘗試存儲文件的本地副本,而不是使用內存流。 – Daniel 2009-05-21 18:07:24