2017-10-20 11 views
-2

多くのスレッドでいくつかのコマンドを実行したいとしましょう。C#continue/break leaking memory

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

メモリをリークする文字列連結(特に)に問題はないようです。すべての文字列は1回だけ割り当てられ、各反復で範囲外になります(したがって、GCの候補になります)。おそらく、文字列を連続して作成するだけで、メモリを収集する前にメモリがいっぱいになる可能性が高いでしょう。 –

+0

おそらく、別の質問は、ガベージコレクション時間が保証されているか瞬時であるかどうかです。 – numbtongue

+0

文字列を各繰り返しと連結する無限ループは、無限のメモリ消費を引き起こします。しかし、 'StringBuilder'への切り替えはそれを修正しません。文字列連結は 'StringBuilder'を使用する場合ほど効率的ではないので、あなたが参照する"古典的な問題 "には_speed_パフォーマンスが含まれます。両方とも最終的には同じメモリ消費をもたらす。いずれにしても、OPは繰り返し同じ文字列を連結していないため、文字列連結の原因となるスピード・パフォーマンスの問題にも対処できません。 –