C#继续/中断内存泄漏
假设我想在多个线程上执行一些命令。我有以下示例代码:C#继续/中断内存泄漏,c#,loops,memory-leaks,C#,Loops,Memory Leaks,假设我想在多个线程上执行一些命令。我有以下示例代码: for (int i = 0; i < 5000; i++) { new Thread(() => { while (true) { string foo = "foo " + DateTime.Now.Ticks; boo
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();
}
for(int i=0;i<5000;i++)
{
新线程(()=>
{
while(true)
{
字符串foo=“foo”+DateTime.Now.Ticks;
布尔突破=假;
for(int j=0;j
就我而言,这个代码示例,创建5K线程并设置一些字符串,会泄漏内存。代码运行时,内存使用率会越来越高。
现在,我认为这是因为我正在设置变量,然后放弃它们-有没有一种方法可以继续/中断而不增加越来越多的内存使用量?这是一个经典的方法,在循环中用“+”字符连接字符串。相反,在循环中使用StringBuilder组合字符串。您将创建5000个永不终止的线程。您正在泄漏内存。您的标题似乎“责备”中断/继续。您不认为“运行5000个线程,不断创建新字符串”更有可能是原因吗?(我的猜测是,您的CPU被严重绑定,GC没有机会运行。)
如果(j==5)继续代码>部分是不需要的,因为没有其他代码可以运行-循环将继续。您生成5000个线程,每个线程在一个紧密的、永无止境的循环中生成11到101 22个字符串。也许您想在if(breakout)
块中使用break
而不是continue
?但是@rufus-l字符串不应该被GC丢弃吗?字符串串联(特别是)似乎没有任何会泄漏内存的问题。所有字符串只分配一次,并且它们在每次迭代中都超出范围(因此成为GC的候选对象)。更可能的情况是,仅仅连续创建字符串就在收集之前填满了内存。可能是这样,但另一个问题是,垃圾收集时间是否有保证,或者是否是瞬间将字符串与每次迭代连接在一起的无限循环肯定会导致无限内存消耗。但是切换到StringBuilder
并不能解决这个问题。您提到的“经典问题”涉及速度性能,而不是内存性能,因为字符串连接不如使用StringBuilder
有效。两者最终都会导致相同的内存消耗。在任何情况下,OP都不会重复连接同一个字符串,因此不会遇到字符串连接导致的速度性能问题。