2012-07-02 229 views
-1

我在VB.NET中開發了桌面應用程序。框架是3.5和後端作爲SQL Server 2005.內存不足異常

下面是代碼[釋放內存時關閉窗體]我已經寫在主窗體,從中繼承所有窗體。

Private Declare Auto Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean 
Private Declare Function EmptyWorkingSet Lib "psapi.dll" (ByVal hProcess As IntPtr) As Long 

Private Sub frmEMR_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed 
    GC.Collect() 
    GC.WaitForPendingFinalizers() 
    GC.RemoveMemoryPressure(GC.GetTotalMemory(True)) 
    EmptyWorkingSet(Process.GetCurrentProcess.Handle) 
    SetProcessWorkingSetSize(Process.GetCurrentProcess.Handle, -1, -1) 
End Sub 

雖然我寫了這個堆內存有爭議的增加。

此外,未管理的內存增加。

任何人都可以幫我解決這個問題。

感謝&問候

血管沙阿

回答

1

我的第一個內存泄漏問題時,通過所有的代碼,並確保如果對象具有dispose()方法來使用它的規則。不知道你的應用程序在做什麼,我只能猜測,但我知道很多.NET SQL對象都有dispose()close()函數。如果你的應用使用了很多這些,那麼你可能已經忘記處理它們了。

+0

是的,你是對的,但我想寫一些概括,所以我可以寫在主表格和工作的所有繼承形式。 –

+0

通常情況下,最好的做法是儘快處置完成。這樣你就不會發生內存不足錯誤的風險。基本上,您的應用程序正在創建所有這些實例,並使用該內存,並且在關閉表單之前內存不會被釋放。在您完成後立即處置的地方,內存可用於下一個命令。 – JRSofty

1

There's no point In calling EmptyWorkingSet if you call SetProcessWorkingSetSize with -1, -1 later,because this will also empty empty working set。

另外我不明白你爲什麼打電話RemoveMemoryPressure與返回值GetTotalMemory。這沒有任何意義......

我advide是:

  • 周圍不要惹垃圾收集(如果你不知道你在做什麼)。垃圾回收器會爲你做。

如果內存不足,可能是內存泄漏。你不會通過隨機調用你不明白的函數來修復它。

我敢打賭,你的問題是由不正確處理非託管ressources造成的,我也敢打賭,你正在使用的實施IDisposable框架的類和你不處置它們(通過調用Dispose或使用using關鍵字) 。

確保處置所有這些對象。如果問題仍然存在,請使用memory profilerSOS查找內存泄漏的原因。

沒有可以調用的靈丹妙藥修復bug。

也可以在StackOverflow上查看同一主題的大量問題。

+0

我已經在使用ANTS Memory Profiler。從這我顯示非託管內存和堆存儲正在增加,並獲得memroy例外 –