2012-07-02 174 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例外 –