我面对的是一种非常奇怪的行为。 使用这个虚拟代码:
static void Main( string[] args )
{
int i = 0;
while ( true )
{
i++;
String giro = "iteration " + i;
Console.WriteLine(giro);
Thread.Sleep(40);
}
}
使用perfom私有字节正在增加。
img http://dl.dropbox.com/u/2478017/memory.gif
怎么可能?
我认为GC负责这些事情。
此外,如果我将这个的内存行为与我每10次迭代强制GC收集的版本进行比较,结果是(对我来说)令人惊讶:
绿色流程是没有GC.COllect()的流程,黑色流程是另一个。
你能帮我理解这个问题吗?
谢谢!
答案 0 :(得分:9)
你正在创建一堆字符串。 GC还不适合收集它们。最终记忆图将稳定下来。 GC工作正常 - 这里没有问题:)
答案 1 :(得分:4)
GC不会直接整理内存。那将是非常低效的。
答案 2 :(得分:1)
使用StringBuilder而不是String,看看是否无法解决您的问题。
答案 3 :(得分:1)
没有泄漏。删除Thread.Sleep(40);等待更长时间,GC应该会在一段时间后启动。
答案 4 :(得分:0)
尝试更改此内容:
String giro = "iteration " + i;
Console.WriteLine(giro);
到
Console.WriteLine("iteration " + i);
答案 5 :(得分:0)
如果您需要垃圾收集器,可以调用它:
GC.Collect();
GC.WaitForPendingFinalizers();
......虽然它非常昂贵......
答案 6 :(得分:0)
如果你定义为giro out of loop 它会解决你的问题
String giro;
while ( true )
{
i++;
giro = "iteration " + i;
Console.WriteLine(giro);
Thread.Sleep(40);
}