循环范围和内存问题

Kev*_*vin 1 c#

假设我有以下代码......

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
  MyCustomClass myObj = new MyCustomClass();
  sb.Append(myObj.RenderShortString());
}
Console.Write(sb.ToString());
Run Code Online (Sandbox Code Playgroud)

并假设MyCustomClass是一个非常大的对象.例如,假设它创建并保存一个包含1MB字符串的内部成员.RenderShortString()方法只是呈现一个长度约为100个字符的字符串.

注意这循环10000次.

我有一些基本上像这样的东西导致循环内部的System.OutOfMemory异常.

我的问题与垃圾收集器清理为每个myObj实例分配的内存空间有关.我不认为我遇到了StringBuilder的问题,但我可能错了.我感觉myObj的实例正在内存中分配,但是在退出循环之后才能进行清理.它是否正确?如果是这样,我怎么能告诉应用程序一旦我得到我的渲染字符串,我就完成了那个实例?

Kev*_*che 5

您正在.net中看到垃圾收集的"功能".一旦超出范围,对象将被销毁,并且每次迭代时每个myObj都超出范围但是由于GC不确定,因此您不知道何时.

这里解释了一下:循环和垃圾收集

此外,这是一个关于.net的GC的有趣研究.它建议尽可能避免在循环内使用"new".

http://nerds-central.blogspot.com/2008/10/net-garbage-collector-pain.html