C#继续/破解内存泄露
假设我想在很多线程上执行一些命令。我有这个示例代码:C#继续/破解内存泄露
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线程和设置一些字符串,泄漏内存就我而言。随着代码的运行,内存使用率越来越高。 现在,我认为这是因为我设置变量,然后放弃它们 - 有没有一种方法可以继续/中断内存使用增加越来越多?
这是一个经典的issue,它将一个字符串中的字符串连接成“+”字符。在循环中使用StringBuilder来组合字符串。
似乎没有任何字符串连接(特别是)会泄漏内存的问题。所有字符串只被分配一次,并且在每次迭代时超出范围(因此成为GC的候选人)。可能更有可能的是,只有连续创建字符串才能在收集内容之前填充内存。 –
大概,但另一个问题是如果垃圾回收时间保证或瞬间 – numbtongue
每次迭代连接一个字符串的无限循环肯定会造成无限的内存消耗。但切换到'StringBuilder'不会解决这个问题。你提到的“经典问题”涉及_speed_性能,而不是内存性能,因为字符串连接不如使用StringBuilder那样高效。两者最终都会导致相同的_memory_消耗。在任何情况下,OP都不会重复连接相同的字符串,因此甚至不会遇到速度性能问题字符串连接的原因。 –
您正在创建5000个永不终止的线程。你正在泄漏记忆。 –
你的头衔似乎“怪”打破/继续。你不认为“运行5000个不断创建新字符串的线程”更可能是原因吗? (我的猜测是你的CPU太重,GC没有机会运行。) –
'if(j == 5)continue;'不需要部分,因为没有其他代码会无论如何运行 - 无论如何循环将继续。 –