从ascx页面中的C#方法调用返回的字符串的垃圾收集

时间:2010-03-18 12:25:00

标签: c# asp.net garbage-collection

对于在ASP.NET上开发的Web应用程序,我们发现对于用户控制文件(ascx),我们返回长字符串作为方法调用的结果。它们使用特殊标记<% %>

嵌入到ascx页面中

在为应用程序执行内存转储分析时,我们发现其中许多字符串都没有被垃圾回收。此外,ascx页面被编译为临时DLL,并且它们保存在内存中。这是否导致长字符串保留在内存中而不是垃圾回收?

注意:字符串大小超过85K。

2 个答案:

答案 0 :(得分:2)

如果它们是作为字符串文字生成的,那么很可能它们被实习。在应用程序的生命周期内,不太可能释放实习字符串。这可以解释为什么不收集变量。

您可以通过使用CompilationRelaxations属性和标志NoStringInterning标记程序集来验证这一点。

System.String上的Intern属性在“性能”部分下有关于此主题的大量信息

答案 1 :(得分:2)

您的字符串是在大对象堆上分配的,不会与其他小对象一起收集。它使用不同的阈值,如Tess Ferrandez所述。 正如她所说,您可以尝试致电

GC.Collect(3)
GC.WaitForPendingFinalizers()
GC.Collect(3)

并查看是否正在收集它们。