内存异常

时间:2012-07-02 10:25:40

标签: vb.net memory desktop

我在VB.NET中开发了桌面应用程序。 Framework是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

虽然我写了这个堆内存有争议的增加。

此外,未管理的内存也在增加。

任何人都可以帮助我解决这个问题。

谢谢&此致

Hemal shah

2 个答案:

答案 0 :(得分:1)

处理内存泄漏时的第一条规则,遍历所有代码并确保对象具有dispose()方法来使用它。不知道你的应用程序在做什么,我只能猜测,但我知道很多.NET SQL对象都有dispose()close()个函数。如果你的应用程序使用了很多这些,那么你可能忘记了处理它们。

答案 1 :(得分:1)

如果您稍后使用EmptyWorkingSet致电SetProcessWorkingSetSize,则-1, -1会有no point,因为这也会清空工作集。

另外,我不明白为什么要使用RemoveMemoryPressure的返回值来调用GetTotalMemory。这没有任何意义......

我的建议是:

  • 不要乱搞垃圾收集(如果你不知道你在做什么)。垃圾收集器会为你做。

如果内存不足,可能会发生内存泄漏。您不会通过随机调用您不理解的函数来修复它。

我打赌你的问题是由于没有正确处理非托管资源造成的,而且我还打赌你正在使用实现IDisposable的框架类而你没有处理它们(通过调用{{1}或使用Dispose关键字)。

确保处置所有这些对象。如果问题仍然存在,请使用memory profilerSOS查找内存泄漏的原因。

没有可以调用的银弹方法可以神奇地修复你的错误。

另请参阅StackOverflow上同一主题的众多问题。