如何减少VB.NET Windows应用程序中的内存?

时间:2010-09-24 07:44:15

标签: vb.net memory out-of-memory

我正在研究VB.NET多用户应用程序,每当我的任何表单打开时 - 内存都会上升,并且会在一段时间后抛出OutOfMemoryException

我正在研究VB.net 2008和SqlServer 2005。 我已经使用了很多共享对象所以第二次内存分配较少, 但是当表格关闭或不使用时我如何减少它。 我可以使用垃圾收集器或Dispose以及我如何使用此功能吗?

5 个答案:

答案 0 :(得分:3)

您是否根据需要分离所有事件处理程序?这是.NET应用程序中常见的内存泄漏源。

您可以使用ANTS Memory Profiler等工具进行排查,或者如果您更喜欢免费选项WinDbg+SOS非常有用(但不是那么容易使用)。

答案 1 :(得分:2)

使用.net垃圾收集是一个自动过程,可以清除内存中任何未使用的对象。

在等待垃圾收集时,很多内存可能会“丢失”到程序中。

通常你应该单独留下垃圾收集器。它通常可以很好地决定什么时候打扫房子是值得的。

但你可能希望不时强行伸手。

有一个非常简单的调用来清除垃圾收集。

GC.Collect的()

希望这有帮助。

尽管如此,您可能还有一些其他问题需要内存异常。

你是偶然处理影像吗?

答案 2 :(得分:1)

尝试发布RAM MEMORY的代码:

首先声明这个功能:

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Int32, ByVal dwMaximumWorkingSetSize As Int32) As Int32

这就是它的用法:

Friend Sub ReleaseMemory()
    Try
        GC.Collect()
        GC.WaitForPendingFinalizers()
        If Environment.OSVersion.Platform = PlatformID.Win32NT Then
            SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
        End If
    Catch ex As Exception
        LogError(ex.ToString())
    End Try
End Sub

答案 3 :(得分:0)

确保在不再需要对象时删除对象的所有引用。 (或对父对象的所有引用)

如果您的某个活动表单仍然使用您不需要的对象,则垃圾收集器将假定您仍然需要它,并且不会将其从内存中删除。

不要忘记在需要时调用.Dispose()。

有一些很棒的工具可以帮助你提示你的记忆问题。

答案 4 :(得分:-6)

最好的:

Public Class FreeMemory     私有声明函数SetProcessWorkingSetSize Lib" kernel32.dll" (_  ByVal process As IntPtr,_  ByVal minimumWorkingSetSize As Integer,_  ByVal maximumWorkingSetSize As Integer)As Integer

Public Shared Sub FlushMemory()
    GC.Collect()
    GC.WaitForPendingFinalizers()
    If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then
        SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1)
    End If
End Sub

结束班