对于在ASP.NET上开发的Web应用程序,我们发现对于用户控制文件(ascx),我们返回长字符串作为方法调用的结果。它们使用特殊标记<% %>
在为应用程序执行内存转储分析时,我们发现其中许多字符串都没有被垃圾回收。此外,ascx页面被编译为临时DLL,并且它们保存在内存中。这是否导致长字符串保留在内存中而不是垃圾回收?
注意:字符串大小超过85K。
答案 0 :(得分:2)
如果它们是作为字符串文字生成的,那么很可能它们被实习。在应用程序的生命周期内,不太可能释放实习字符串。这可以解释为什么不收集变量。
您可以通过使用CompilationRelaxations
属性和标志NoStringInterning标记程序集来验证这一点。
System.String
上的Intern属性在“性能”部分下有关于此主题的大量信息
答案 1 :(得分:2)
您的字符串是在大对象堆上分配的,不会与其他小对象一起收集。它使用不同的阈值,如Tess Ferrandez所述。 正如她所说,您可以尝试致电
GC.Collect(3)
GC.WaitForPendingFinalizers()
GC.Collect(3)
并查看是否正在收集它们。