2017-10-20 150 views
-2

假设我想在很多线程上执行一些命令。我有这个示例代码: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线程和设置一些字符串,泄漏内存就我而言。随着代码的运行,内存使用率越来越高。 现在,我认为这是因为我设置变量,然后放弃它们 - 有没有一种方法可以继续/中断内存使用增加越来越多?

+1

您正在创建5000个永不终止的线程。你正在泄漏记忆。 –

+4

你的头衔似乎“怪”打破/继续。你不认为“运行5000个不断创建新字符串的线程”更可能是原因吗? (我的猜测是你的CPU太重,GC没有机会运行。) –

+1

'if(j == 5)continue;'不需要部分,因为没有其他代码会无论如何运行 - 无论如何循环将继续。 –

回答

-4

这是一个经典的issue,它将一个字符串中的字符串连接成“+”字符。在循环中使用StringBuilder来组合字符串。

+0

似乎没有任何字符串连接(特别是)会泄漏内存的问题。所有字符串只被分配一次,并且在每次迭代时超出范围(因此成为GC的候选人)。可能更有可能的是,只有连续创建字符串才能在收集内容之前填充内存。 –

+0

大概,但另一个问题是如果垃圾回收时间保证或瞬间 – numbtongue

+0

每次迭代连接一个字符串的无限循环肯定会造成无限的内存消耗。但切换到'StringBuilder'不会解决这个问题。你提到的“经典问题”涉及_speed_性能,而不是内存性能,因为字符串连接不如使用StringBuilder那样高效。两者最终都会导致相同的_memory_消耗。在任何情况下,OP都不会重复连接相同的字符串,因此甚至不会遇到速度性能问题字符串连接的原因。 –