.NET 4.x утечка памяти - C#

Узнай цену своей работы

Формулировка задачи:

есть код
Листинг программы
  1. private static Object XmlDeserialize(Type t, String xmlDoc, String xmlRoot)
  2. {
  3. if (String.IsNullOrEmpty(xmlDoc))
  4. {
  5. return t.GetConstructors().FirstOrDefault(x => x.GetParameters().Length == 0)?.Invoke(null);
  6. }
  7. /// В коде ниже утечка
  8. var serializer = String.IsNullOrEmpty(xmlRoot) ? new XmlSerializer(t) : new XmlSerializer(t, new XmlRootAttribute(xmlRoot));
  9. using (var memoryStream = new MemoryStream(StringToUtf8ByteArray(xmlDoc)))
  10. {
  11. return serializer.Deserialize(memoryStream);
  12. }
  13. }
  14. // Метод конвертирует строку в UTF8 Byte массив
  15. private static Byte[] StringToUtf8ByteArray(string xmlString)
  16. {
  17. UTF8Encoding encoding = new UTF8Encoding();
  18. var byteArray = encoding.GetBytes(xmlString);
  19. return byteArray;
  20. }
Но при большом количестве объектов которые надо десериализовать (около 3000) Он выжирает 1,5 гига приватной и после окончания работы не отдаёт. В итоге прога после пары запусков процесса падает с outofmemoryexception. Что не так? Сам косяка не вижу. PS: Метод статический и находится в статическом классе.

Решение задачи: «.NET 4.x утечка памяти»

textual
Листинг программы
  1. private static readonly Hashtable Serializers = new Hashtable();
  2.   private static Object XmlDeserialize(Type t, String xmlDoc, String xmlRoot)
  3.         {
  4.             if (String.IsNullOrEmpty(xmlDoc))
  5.             {
  6.                 return t.GetConstructors().FirstOrDefault(x => x.GetParameters().Length == 0)?.Invoke(null);
  7.             }
  8.             //https://msdn.microsoft.com/ru-ru/library/system.xml.serialization.xmlserializer(v=vs.110).aspx
  9.             //If you use any of the other constructors, multiple versions of the same assembly are generated and never unloaded, which results in a memory leak and poor performance.
  10.             //The easiest solution is to use one of the previously mentioned two constructors. Otherwise, you must cache the assemblies in a Hashtable, as shown in the following example.
  11.             var key = new { t.FullName, xmlRoot };
  12.             XmlSerializer serializer;
  13.             if (Serializers.Contains(key))
  14.             {
  15.                 serializer = (XmlSerializer)Serializers[key];
  16.             }
  17.             else
  18.             {
  19.                 serializer = String.IsNullOrEmpty(xmlRoot) ? new XmlSerializer(t) : new XmlSerializer(t, new XmlRootAttribute(xmlRoot));
  20.                 Serializers.Add(key, serializer);
  21.             }
  22.             using (var memoryStream = new MemoryStream(StringToUtf8ByteArray(xmlDoc)))
  23.             {
  24.                 return serializer.Deserialize(memoryStream);
  25.             }
  26.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут