2011-07-25 11 views
2

私はバイト配列から正常にアセンブリ(exe)を実行しています。私のコードは:なぜアセンブリの呼び出しに非常に多くのRAMが必要ですか?

public static void Execute(byte[] assembly, string arg) { 
    if (assembly[0x3c] == 0x80) { 
      object[] o = new object[] { new string[] { arg } }; 
      try { 
       Assembly.Load(assembly).EntryPoint.Invoke(null, o); 
      } catch (TargetInvocationException e) { 
       throw e.InnerException; 
      } 
    } else { 
      throw new Exception("File is not a valid .NET assembly."); 
    } 
} 

すべてが問題ありませんが、実行可能ファイルはメモリをリークしています。元のファイルは6〜10MB必要ですが、このファイルを実行すると40〜60MB、最大145MBのファイルが作成されます(そして10に落として再びループします)。

なぜこのようなことが起こりますか、メモリとアイデアを漏らすのはなぜですか?

答えて

3

メモリがリークしていません。ガベージコレクションの効果が見えています。ガベージコレクションは、システムがより多くのメモリが必要であると判断したときに、将来のある時点まで延期することができます。これは、プロセスの使用率が急に低下した場合に起こります。

心配する必要はありません。それは完全に正常です。さらに、それはシステムが設計されている方法です。この動作は、実行時間や全体的なメモリ使用量には影響しません。

+0

はい、ただし、gcメモリバッファを解放して解放する必要があります。だから私は何とかそれを埋めて、それを収集すると思う。それは通常10MBに達し、今は150MBのようです。 – blez

+0

150mbはあまりにも多く、私は何とかそれを低くする必要があります。 – blez

+2

@ blez、あなたのマシンの_any_プロセスがメモリを必要とするとすぐに、.NETはガベージコレクションを実行し、残ったままのジャンクをクリーンアップします。何人かの人々は自分の家をいつもきちんとした状態に保つのが好きで、何人かの人は来るときだけ清掃するのが好きです。 .NETは後者に似ています。それにもかかわらず、ゲスト(他のプロセス)はきれいな家しか見ることができません。 –

0

通常、N + 1組のアセンブリ(バイト配列)はメモリに保存されていません。私はあなたの格差を見ます。