我正在研究VB.NET多用户应用程序,每当我的任何表单打开时 - 内存都会上升,并且会在一段时间后抛出OutOfMemoryException
。
我正在研究VB.net 2008和SqlServer 2005。 我已经使用了很多共享对象所以第二次内存分配较少, 但是当表格关闭或不使用时我如何减少它。 我可以使用垃圾收集器或Dispose以及我如何使用此功能吗?
答案 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
结束班