2016-08-11 20 views
4

extraTypesパラメータでXmlSerializerコンストラクタをたくさん呼び出すアプリケーションを開発しています。私は、各呼び出しが約100KBと2つの記述子(時にはそれ以上)のためにアプリケーションメモリを引き出すことを知りました。 コード例:100キロバイト、各コールXmlSerializer extraTypesメモリリーク

while (true) 
      { 
       Console.ReadLine(); 
       new XmlSerializer(typeof (object), new Type[] {}); 
      } 

43024キロバイトと2004のハンドラ

for (var i = 0; i < 1000; i++) 
      { 
       new XmlSerializer(typeof (object), new Type[] {}); 
      } 

のこれだけsiplest例えば、このコードencreaseアプリケーションメモリあたり2つのハンドラの

このコードencreaseのアプリケーションメモリコンソールアプリケーション:

internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      //this code encrease application memory for 43024KB and 2004 handlers 
      for (var i = 0; i < 1000; i++) 
      { 
       new XmlSerializer(typeof (object), new Type[] {}); 
      } 
      Console.WriteLine("Finished. Press any key to continue..."); 


      Console.ReadLine(); 
     } 
    } 

XmlSerializerのバグですか、何か間違っているimですか?

p.s.上の最適化コードと同じと

+0

[StreamReaderとXmlSerializerを使用してメモリリークが発生する](https://stackoverflow.com/questions/23897145/memory-leak-using-streamreader-and-xmlserializer) – dbc

答えて

4

[OK]を構築リリース、答えはMSDN https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/にすでにある

ショット答えは:いいえ、それはバグではありません、それは機能です;)

XmlSerializerをを作成しますextraTypesパラメータを持つ各コンストラクタの呼び出しごとにTempAssembly。そして、 "アセンブリはGCヒープ上のオブジェクトではなく、GCは実際にアセンブリを認識しないので、ガベージコレクションは行われません"

解決方法は、XmlSerializerを辞書にキャッシュし、代わりに1つのオブジェクト新しいXmlSerializerを作成する必要があるたびに

+0

Yep、別の方法として、新しいAppDomainでコードを処理し、処理後にappDomainをアンロードする方法があります。したがって、あなたはこの一時アセンブリを取り除くでしょう。 ちょうどXmlSerializerをデバッグし、あなたの答え、いい質問に言ったことを正確に見た – ams4fy