ASP.NET-连接字符串内存泄漏

ASP.NET-连接字符串内存泄漏,asp.net,vb.net,Asp.net,Vb.net,我支持一个应用程序,它使用大量字符串连接,我相信这是导致内存泄漏的原因,最终导致OutOfMemory异常。请查看以下代码: Public Sub ConcatenateString() As String Dim Test1 As String Test1 = "Hello" Test1=Test1 & "my" Test1=Test1 & "name" Test1=Test1 & "is" Test1=Test1 & "joe" Test1=Tes

我支持一个应用程序,它使用大量字符串连接,我相信这是导致内存泄漏的原因,最终导致OutOfMemory异常。请查看以下代码:

Public Sub ConcatenateString() As String Dim Test1 As String

Test1 = "Hello" 
Test1=Test1 & "my" 
Test1=Test1 & "name" 
Test1=Test1 & "is" 
Test1=Test1 & "joe" 
Test1=Test1 & "blogs" 
Test1=Test1 & "what" 
Test1=Test1 & "is" 
Test1=Test1 & "yours?" 'line 10

return Test1

End Sub

我相信在第十行内存中有九个字符串,因为字符串是一个不可变的对象,但只有一个对字符串Test1的引用包含:“你好,我的名字是Joe,你的是什么?”。我的问题是,;当这些字符串超出范围时,垃圾收集器是否会拾取它们?i、 e.当子程序完成运行时。我似乎有内存泄漏,我想我真的应该使用StringBuilder对象

在你所说的这种情况下。。。您需要使用而不是连接

垃圾收集不一定在方法块结束后发生,而是在稍后的某个时间发生

有关
String串联
StringBuilder
之间更好的比较和解释,请参阅此链接


在您所述的情况下。。。您需要使用而不是连接

垃圾收集不一定在方法块结束后发生,而是在稍后的某个时间发生

有关
String串联
StringBuilder
之间更好的比较和解释,请参阅此链接


字符串的串联即使非常大,也不太可能导致内存不足异常。在如今的虚拟内存时代,内存不足异常很少是RAM实际耗尽的迹象。相反,内存不足异常的常见原因是系统句柄(例如GDI对象、文件句柄)不足。通过在任务管理器中显示这些列,可以查看正在使用的句柄总数。每个进程可以创建的最大句柄数取决于您使用的windows版本及其设置方式,但通常最大句柄数为10000

一旦创建的字符串不再被引用,它们将被视为死字符串,垃圾收集器将销毁它们并释放内存。所以,是的,只要方法存在,所有这些字符串最终都会被收集,但不能保证它什么时候开始收集。如果确实需要强制垃圾收集器立即收集死对象,可以通过调用
GC.collect()
来完成

然而,像这样连接字符串是不好的做法。这是非常低效的,尤其是对于大字符串。在以下情况下,应使用StringBuilder:

Public Sub ConcatenateString() As String Dim Test1 As String
    Dim builder As New StringBuilder()
    builder.Append("Hello")
    builder.Append("my")
    builder.Append("name") 
    builder.Append("is")
    builder.Append("joe") 
    builder.Append("blogs") 
    builder.Append("what")
    builder.Append("is")
    builder.Append("yours?")
    Return builder.ToString()
End Sub

即使字符串非常大,串接也不太可能导致内存不足异常。在如今的虚拟内存时代,内存不足异常很少是RAM实际耗尽的迹象。相反,内存不足异常的常见原因是系统句柄(例如GDI对象、文件句柄)不足。通过在任务管理器中显示这些列,可以查看正在使用的句柄总数。每个进程可以创建的最大句柄数取决于您使用的windows版本及其设置方式,但通常最大句柄数为10000

一旦创建的字符串不再被引用,它们将被视为死字符串,垃圾收集器将销毁它们并释放内存。所以,是的,只要方法存在,所有这些字符串最终都会被收集,但不能保证它什么时候开始收集。如果确实需要强制垃圾收集器立即收集死对象,可以通过调用
GC.collect()
来完成

然而,像这样连接字符串是不好的做法。这是非常低效的,尤其是对于大字符串。在以下情况下,应使用StringBuilder:

Public Sub ConcatenateString() As String Dim Test1 As String
    Dim builder As New StringBuilder()
    builder.Append("Hello")
    builder.Append("my")
    builder.Append("name") 
    builder.Append("is")
    builder.Append("joe") 
    builder.Append("blogs") 
    builder.Append("what")
    builder.Append("is")
    builder.Append("yours?")
    Return builder.ToString()
End Sub

只有几个字符串不足以导致内存异常,除非在没有交换或RAM的系统上,或者在内存约为1MB的系统上。@Linux_iOS.rb.cpp.c.lisp.m.sh,我支持的系统连接非常大的字符串。这是一个非常简单的示例。@w0051977,在您所述的情况下。。。您需要使用
stringbuilder类
,不要进行连接。只有几个字符串不足以导致内存异常,除非在没有交换或RAM的系统上,或者在内存约为1MB的系统上。@Linux_iOS.rb.cpp.c.lisp.m.sh,我支持的系统连接非常大的字符串。这是一个非常简单的示例。@w0051977,在您所述的情况下。。。您需要使用
stringbuilder类
,而不要使用连接。感谢+1关于文件句柄的建议。是否有一个有用的免费工具,你可以建议寻找内存泄漏。我目前正在使用windbg,但学习曲线似乎很陡峭。@w0051977对不起,我对任何一个都不熟悉。正如我所说,通过跟踪句柄,您可以在任务管理器中看到当前句柄的数量随着代码的逐步增加,因此在没有第三方工具的情况下,很容易确定这些泄漏的来源(如果存在)。感谢+1关于文件句柄的建议。是否有一个有用的免费工具,你可以建议寻找内存泄漏。我目前正在使用windbg,但学习曲线似乎很陡峭。@w0051977对不起,我对任何一个都不熟悉。正如我所说,通过跟踪句柄,您可以在任务管理器中看到当前句柄的数量随着代码的逐步增加,因此在没有第三方工具的情况下,很容易确定这些泄漏的来源(如果存在)。