C# 为什么单个循环会导致内存泄漏?
我面临着一种非常奇怪的行为。 使用此虚拟代码:C# 为什么单个循环会导致内存泄漏?,c#,.net,memory-management,garbage-collection,C#,.net,Memory Management,Garbage Collection,我面临着一种非常奇怪的行为。 使用此虚拟代码: static void Main( string[] args ) { int i = 0; while ( true ) { i++; String giro = "iteration " + i; Console.WriteLine(giro); Thread.Sleep(40);
static void Main( string[] args )
{
int i = 0;
while ( true )
{
i++;
String giro = "iteration " + i;
Console.WriteLine(giro);
Thread.Sleep(40);
}
}
使用perfom时,专用字节正在增加
怎么可能呢
我以为GC会处理这些东西
此外,如果我将其内存行为与每10次迭代强制GC收集一次的版本进行比较,结果(对我来说)令人惊讶:
绿色进程是没有GC.COllect()的进程,黑色进程是另一个进程
你能帮我理解这个问题吗
谢谢 您正在创建一组字符串。总司令部认为还不适合收集它们。最终,内存图将趋于平稳。GC工作正常-这里没有问题:)GC不会立即清理内存。这将是非常低效的 使用StringBuilder而不是String,看看这是否解决不了您的问题。没有泄漏。移除螺纹。睡眠(40);等待更长时间,GC应该在一段时间后启动。尝试更改此选项:
String giro = "iteration " + i;
Console.WriteLine(giro);
到
如果需要垃圾收集器,可以将其称为:
GC.Collect();
GC.WaitForPendingFinalizers();
…但是它非常昂贵…如果您定义要跳出循环 它会解决你的问题
String giro;
while ( true )
{
i++;
giro = "iteration " + i;
Console.WriteLine(giro);
Thread.Sleep(40);
}
从9.5 MB到11 MB?你担心吗?别担心,它最终会被清理干净的。问题是内存在2小时后就以这种方式运行了。@ff8mania:那只是因为你的程序非常慢,大部分时间都在睡觉。你是对的。但是有人可以解释为什么强制GC的版本总是扁平的?它是扁平的,因为它总是被收集的,因为你强制GC。你能更好地解释你的回答吗?为什么睡眠会影响GC?@ff8mania:我说移除睡眠可以更快地创建字符串对象,从而更快地看到它对内存的影响。通过这种方式,您可以看到它是在无限期地填充内存(真正的泄漏),还是仅仅是VM或GC行为的产物。我认为你的程序不会泄露任何信息。它会变平的。这不是真正的泄密。
String giro;
while ( true )
{
i++;
giro = "iteration " + i;
Console.WriteLine(giro);
Thread.Sleep(40);
}