-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

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

非托管内存也在增加。

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

感谢和问候

赫马尔沙阿

4

2 回答 2

1

如果您稍后调用with则调用没有意义,因为这也会清空工作集。EmptyWorkingSetSetProcessWorkingSetSize-1, -1

另外我不明白你为什么RemoveMemoryPressureGetTotalMemory. 这没有任何意义...

我的建议是:

  • 不要乱用垃圾收集(如果你不知道自己在做什么)。垃圾收集器会为你做这件事。

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

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

确保处理所有这些对象。如果问题仍然存在,请使用内存分析器SOS查找内存泄漏的原因。

您可以调用任何灵丹妙药方法来神奇地修复您的错误。

还可以在 StackOverflow 上查看相同主题的众多问题。

于 2012-07-02T10:58:11.800 回答
1

在处理内存泄漏时,我的第一条规则是检查所有代码并确保对象是否有dispose()使用它的方法。不知道您的应用程序在做什么,我只能猜测,但我知道许多 .NET SQL 对象具有dispose()close()功能。如果您的应用程序使用了很多这些,那么您可能已经忘记处理它们。

于 2012-07-02T10:32:11.513 回答