Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
1
.NET 4.x

утечка памяти

29.07.2015, 12:11. Показов 1285. Ответов 2
Метки нет (Все метки)

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

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка...

Утечка памяти
Здравствуйте. Навоял такой вот кодик. Когда много файлов в директории dir, происходит утечка...

Память, утечка памяти
Всем привет, начал изучать C#, есть некоторые значимые различия с С++. Такой вопрос к бывалым: ...

Сильная утечка памяти!
Приложение стартует с 4Mb, кликаем один раз на другую картинку в листбоксе или используем кнопку...

2
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
29.07.2015, 12:33 2
а если
C#
1
2
3
4
5
6
using (var memoryStream = new MemoryStream(StringToUtf8ByteArray(xmlDoc)))
{
    var temp = serializer.Deserialize(memoryStream);
}
 
return temp;
PS код не рабочий, temp надо объявить до using, но сам смысл.
0
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.07.2015, 12:38  [ТС] 3
Решение если кому интересно, о проблеме утечки было написано в доке на msdn
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static readonly Hashtable Serializers = new Hashtable();
  private static Object XmlDeserialize(Type t, String xmlDoc, String xmlRoot)
        {
            if (String.IsNullOrEmpty(xmlDoc))
            {
                return t.GetConstructors().FirstOrDefault(x => x.GetParameters().Length == 0)?.Invoke(null);
            }
            //https://msdn.microsoft.com/ru-ru/library/system.xml.serialization.xmlserializer(v=vs.110).aspx
            //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. 
            //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.
            var key = new { t.FullName, xmlRoot };
            XmlSerializer serializer;
            if (Serializers.Contains(key))
            {
                serializer = (XmlSerializer)Serializers[key];
            }
            else
            {
                serializer = String.IsNullOrEmpty(xmlRoot) ? new XmlSerializer(t) : new XmlSerializer(t, new XmlRootAttribute(xmlRoot));
                Serializers.Add(key, serializer);
            }
            using (var memoryStream = new MemoryStream(StringToUtf8ByteArray(xmlDoc)))
            {
                return serializer.Deserialize(memoryStream);
            }
        }
PS C# 6
0
29.07.2015, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2015, 12:38
Помогаю со студенческими работами здесь

Утечка памяти в DataRow
Добрый день(утро, вечер, ночь) уважаемые форумчане! Я только-только начинаю работать в большими...

Утечка памяти Process.GetProcessesByName()
Добрый день. Запускаю в цикле. Process p = Process.GetProcessesByName("name") Увеличивается...

Утечка памяти при использовании системного счетчика
Есть некий класс с событием upTimeUpdated (подписчикам отдается время работы ОС) public class...

Утечка памяти при вызове Invalidate контрола
Здравствуйте, создаю windows forms приложение С# на VS2015, содержащее форму (создана визардом по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru