【发布时间】:2017-10-20 20:51:31
【问题描述】:
假设我想在多个线程上执行一些命令。我会有这个示例代码:
for (int i = 0; i < 5000; i++)
{
new Thread(() =>
{
while (true)
{
string foo = "foo " + DateTime.Now.Ticks;
bool breakout = false;
for (int j = 0; j < random.Next(10, 100); j++)
{
string bar = "bar " + DateTime.Now.Ticks;
if (j == 5)
{
continue;
}
if (j == 8)
{
breakout = true;
break;
}
}
if (breakout)
{
continue;
}
string baz = "baz " + DateTime.Now.Ticks;
}
}).Start();
}
这个代码示例,创建 5K 线程并设置一些字符串,就我而言,内存泄漏。随着代码的运行,内存使用率越来越高。 现在,我认为这是因为我正在设置变量然后放弃它们 - 有没有办法可以继续/中断而不会越来越多地增加内存使用量?
【问题讨论】:
-
您正在创建 5000 个永不终止的线程。您正在泄漏内存。
-
您的标题似乎“责备”中断/继续。您不认为“运行 5000 个线程不断创建新字符串”的可能性更大吗? (我的猜测是你的 CPU 被严重固定,以至于 GC 没有机会运行。)
-
不需要
if (j == 5) continue;部分,因为无论如何都不会运行其他代码 - 无论如何循环都会继续。 -
您生成了 5000 个线程,每个线程在一个紧密的、永无止境的循环中生成 11 到 101 个 22 字符的字符串。也许您的意思是在
if (breakout)块中使用break而不是continue? -
@rufus-l 字符串不应该被 GC 丢弃吗?
标签: c# loops memory-leaks