2016-08-11 2 views
4

extraTypes parametr을 사용하여 XmlSerializer 생성자를 많이 호출하는 일부 응용 프로그램을 개발하고 있습니다. 나는 각각의 호출이 약 100KB와 2 개의 디스크립터 (때로는 더 많은 것)를위한 애플리케이션 메모리를 포함한다는 것을 알아 냈다. 코드 예제 : 각 호출XmlSerializer extraTypes memory leak

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

이 코드 encrease 응용 프로그램 43,024킬로바이트 메모리 2004 핸들러

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

의, 그래서 그냥 siplest 예를 당

1백킬로바이트이 코드 encrease 응용 프로그램 메모리와 2 핸들러 콘솔 애플리케이션 :

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.

하는 XmlSerializer가 생성) 아니, 그것은 기능입니다, 버그가 아닙니다 : 최적화에 코드 및 릴리스

+0

StreamReader 및 XmlSerializer를 사용하여 [메모리 누수]가 중복됩니다. (https://stackoverflow.com/questions/23897145/memory-leak-using-streamreader-and-xmlserializer) – dbc

답변

4
은 MSDN에 이미 응답이 https://blogs.msdn.microsoft.com/tess/2006/02/15/net-memory-leak-xmlserializing-your-way-to-a-memory-leak/

샷 대답이 확인되는

구축과 같은 extraTypes 매개 변수가있는 생성자 호출마다 TempAssembly. "어셈블리는 GC 힙의 개체가 아니며 GC는 실제로 어셈블리를 인식하지 못하므로 가비지 수집되지 않습니다"

해결 방법 XmlSerializer를 사전에 캐시하고 대신 형식 당 하나의 개체 만 사용하십시오 새 XmlSerializer를 만들 때마다 새로 만듭니다.

+0

예, 또 다른 접근법은 새 AppDomain에서 코드를 처리하고 처리 후 appDomain을 언로드하는 것입니다. 따라서 여러분은이 임시 어셈블리를 제거 할 것입니다. 그냥 XmlSerializer를 디버깅하고 당신의 대답, 좋은 질문에 말한 정확히 봤어요 – ams4fy