Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
.NET 4.x

Утечка памяти в веб-запросах

20.01.2025, 19:15. Показов 3087. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добра. Бьюсь с одной проблемой, не могу побороть. Есть некий код, который периодически пытается получить файлик с ЯДиска. До этого все работает прекрасно, расход памяти в диспетчере около 2,5 Мб. А после этой проверки (файлик не найден, получаем исключение) начинает улетать в космос. Причем потребление памяти явно растет после каждого выполнения GC.Collect(). Вон уже до 1,5 Гб выросло, больше не растет. Но мне это не нравится. Подскажите пожалуйста нубу как это победить.
VB.NET
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Sub Main()
       Do 'Основной цикл
            If Now > StartS Then
                'Некие операции с изображениями, после чего нужна сборка мусора
                GC.Collect()
            End If
            If DoOnce AndAlso Now > CheckDelay Then '1 раз за запуск, с отсрочкой
                DoOnce = False
                UpdateCheck()
            End If
        Threading.Thread.Sleep(250)
        Loop
End Sub
 
Private Sub UpdateCheck()
        Try 'Проверка обновлений
            Dim Request As HttpWebRequest = HttpWebRequest.Create("https://cloud-api.yandex.net/v1/disk/resources/download?path=" & "app:/update.rar" _
                                                                  & "&fields=href")
            Request.Headers.Set("Authorization", "OAuth " & YDToken)
            Dim Response As HttpWebResponse = Nothing
            Dim Stream As IO.Stream = Nothing
            Dim StrRead As IO.StreamReader = Nothing
            Dim WebCl As New WebClient
            Try
                Response = Request.GetResponse()
                Stream = Response.GetResponseStream()
                StrRead = New IO.StreamReader(Stream)
                Dim JSONanswer As String = StrRead.ReadToEnd 'Ответ сервера в формате JSON, при отсутствии запрашиваемого файла вызывает исключение
                Dim UpLink As String = JSONanswer.Substring(JSONanswer.IndexOf("https")).Replace("""}", "") 'Выделение ссылки на Download из ответа
                Dim PathUpd As String = sAppPath & "\Update"
                If Not IO.Directory.Exists(PathUpd) Then IO.Directory.CreateDirectory(PathUpd)
                Dim ArchUpd As String = PathUpd & "\update.rar"
                WebCl.DownloadFile(New Uri(UpLink), ArchUpd) 'Скачивание файла по ссылке
            Finally
                If WebCl IsNot Nothing Then WebCl.Dispose()
                If StrRead IsNot Nothing Then StrRead.Dispose()
                If Stream IsNot Nothing Then Stream.Dispose()
                If Response IsNot Nothing Then Response.Close()
                Request = Nothing
            End Try
        Catch ex As Exception
            'При отсутствии файла update сервер ответит ошибкой, что вызовет исключение
            WriteLog("Update error. ERR: " & ex.Message)
        End Try
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.01.2025, 19:15
Ответы с готовыми решениями:

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

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при выходе из нее указатель теряется. Или не...

Утечка памяти
Здравствуйте! Я пишу длинную арифметику для целых чисел. Ниже - функция произведения чисел X и Y. Вопрос: произойдет ли утечка памяти, и...

36
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
20.01.2025, 23:19
Студворк — интернет-сервис помощи студентам
Это не победил, а добавил ещё больше костылей.
0
dive
 Аватар для I can
4966 / 4663 / 846
Регистрация: 13.04.2015
Сообщений: 9,861
20.01.2025, 23:20
Цитата Сообщение от Dim_en Посмотреть сообщение
Application.DoEvents()
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
20.01.2025, 23:22
I can, не, я очередную его тему подожду про у меня всё глючит. Спать пора.
0
 Аватар для Волшебник 307
1396 / 331 / 45
Регистрация: 16.04.2013
Сообщений: 786
Записей в блоге: 2
21.01.2025, 00:11
А где ? проверка отсутствия/присутствия файла перед скачкой?
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
21.01.2025, 07:07  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Это не победил, а добавил ещё больше костылей.
Возможно, а есть решение лучше? Почему сборщик перестает работать после исключения? Не допускать исключений?
Цитата Сообщение от Волшебник 307 Посмотреть сообщение
А где ? проверка отсутствия/присутствия файла перед скачкой?
Что-то не разобрался, как получить права на это действие. Писать на диск могу, читать могу, а получить список файлов - нет прав.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
21.01.2025, 08:02
Я выше привёл код, который получает файл или обрабатывает исключение без утечек памяти.
Сборщик мусора вам вызывать не нужно. Если думаете, что нужно, в коде наверняка косяк.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
21.01.2025, 08:30  [ТС]
Rius, я ответил, что этот код не помог. Еще раз поясняю, что (по моим соображениям) утечка не в скачивании файла, а в том, что после появления исключения перестает работать сборщик. А когда он не работает, то другая часть кода, обрабатывающая картинки, приводит к краху, т.к. заканчивается память. До исключения все работает прекрасно, даже без вызова сборщика.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
21.01.2025, 08:41
Значит, ошибка не в нём.
Приводите код, воспроизводящий проблему.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
21.01.2025, 14:48
Dim_en, Вот у Вас два вызова перехвата ошибок Try, второй, в котором происходит загрузка файла, не ловит исключения, и просто выполняет Finally... Может в этом моменте оно все у вас и зависает? Но не уверен на 100%. Попробуйте отлавливать в Catch исключения и обрабатывать их, а лучше вообще отказаться от использования Try друг в друге, задушив таким образом отлов ошибок и вовсе, а взять и выдать пользователю исключение.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
21.01.2025, 17:56  [ТС]
Yury Komar, с вложенным Try стал мудрить, когда думал, что утечка здесь. Хотел таким образом освободить ресурсы в любом случае в блоке Finally. А исключение при отсутствии Catch передается на уровень выше, где и обрабатывается. Но это все не помогло. Как выяснилось, утечка не здесь, а в том, что в этот момент перестает работать сборщик.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
22.01.2025, 02:42
Dim_en, Так ведь Try ресурсы не освобождает. В таком случае, попробуйте использовать Using везде, где его возможно применить, не прибегая к принудительному вызову сборщика мусора самостоятельно.

Добавлено через 8 минут
Еще, как вариант, сделайте процедуру загрузки файла асинхронной или вынесите все в отдельный поток.
Если Вы говорите, что костыль с DoEvents, вроде, решает вашу проблему, то вполне возможно основной поток формы просто виснет нехило.

Качайте файл в другом потоке, по завершении или же при получении исключения просто закрывайте и "диспозьте" этот поток, освободив тем самым память и не нагружая основной поток вашей формы.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
22.01.2025, 18:13  [ТС]
Rius, ну вот упрощенный код. Через 20 сек начинается жор памяти.
Кликните здесь для просмотра всего текста
VB.NET
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Module Module1
 
    Sub Main()
        Dim DoOnce As Boolean = True
        Dim StartSCR As Date = Now
        Dim CheckDelay As Date = Now.AddSeconds(20)
        WriteLog("Start")
        ReadCFG() 'Чтение настроек из файла конфига
 
        Do 'Основной цикл
            If Now > StartSCR Then
                StartSCR = StartSCR.AddSeconds(3)
                CreateSCR()
                GC.Collect()
            End If
            Threading.Thread.Sleep(250)
            If DoOnce AndAlso Now > CheckDelay Then '1 раз за запуск, с отсрочкой
                DoOnce = False
                UpdateCheck()
            End If
        Loop
    End Sub
 
    Private Sub WriteLog(Mes As String)
        Console.WriteLine(Format(Now, "yy.MM.dd HH:mm:ss") & " " & Mes)
    End Sub
 
    Private Sub ReadCFG()
        Try 'Чтение и применение настроек из конфига
            '...
        Catch ex As Exception
            WriteLog("Error in settings, stop. ERR: " & ex.Message)
            End
        End Try
    End Sub
 
    Private Sub UpdateCheck()
        Try 'Проверка обновлений
            If True Then Throw New System.Exception("An exception has occurred.")
            '...
        Catch ex As Exception
            WriteLog("Update error. ERR: " & ex.Message & vbCrLf & ex.ToString)
        End Try
    End Sub
 
    Private Sub CreateSCR()
        Try
            Dim SCR As New Bitmap(2000, 2000, Imaging.PixelFormat.Format32bppRgb)
            Dim SCRrs As New Bitmap(SCR, SCR.Width * 0.8, SCR.Height * 0.8)
            If True Then SCRrs = New Bitmap(getGrey(SCRrs))
            SCR.Dispose()
            SCRrs.Dispose()
        Catch ex As Exception
            WriteLog("Creation error. ERR: " & ex.Message)
        End Try
    End Sub
 
    Private Function getGrey(ByVal bmp As Bitmap) As Bitmap
        Try 'Функция преобразования цветного изображения в оттенки серого
            '...
            Return bmp
        Catch ex As Exception
            WriteLog("Conversion error. ERR: " & ex.Message)
            Return Nothing
        End Try
    End Function
 
End Module
0
dive
 Аватар для I can
4966 / 4663 / 846
Регистрация: 13.04.2015
Сообщений: 9,861
22.01.2025, 18:59
Лучший ответ Сообщение было отмечено Dim_en как решение

Решение

Цитата Сообщение от Dim_en Посмотреть сообщение
GC.Collect()
Попробуте
VB.NET
1
2
3
    
                GC.Collect(1, GCCollectionMode.Forced)
GC.WaitForPendingFinalizers()
3
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
22.01.2025, 19:09
Хмм...

Этот же код на C#, + исключения от ошибки загрузки (без них аналогично):
код

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
using System;
using System.Drawing;
using System.Net;
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var DoOnce = true;
            var StartSCR = DateTime.Now;
            var CheckDelay = DateTime.Now.AddSeconds(20);
            WriteLog("Start");
            ReadCFG(); // Чтение настроек из файла конфига
 
            do
            {
                if (DateTime.Now > StartSCR)
                {
                    StartSCR = StartSCR.AddSeconds(3);
                    CreateSCR();
                    GC.Collect();
                }
 
                System.Threading.Thread.Sleep(250);
                if (DoOnce && DateTime.Now > CheckDelay)
                {
                    DoOnce = false;
                    UpdateCheck();
                }
 
                var JSONanswer = GetJsonFile("https://releases.ubuntu.com/noble/ubuntu-24.04.1-live-server-amd64.json");
                WriteLog(JSONanswer);
            } while (true);
        }
 
        private static void WriteLog(string Mes)
        {
            Console.WriteLine(string.Format("{0:yy.MM.dd HH:mm:ss}", DateTime.Now) + " " + Mes);
        }
 
        private static void ReadCFG()
        {
            try // Чтение и применение настроек из конфига
            {
            }
            // ...
            catch (Exception ex)
            {
                WriteLog("Error in settings, stop. ERR: " + ex.Message);
                Environment.Exit(0);
            }
        }
 
        private static void UpdateCheck()
        {
            try // Проверка обновлений
            {
                if (true)
                    throw new Exception("An exception has occurred.");
            }
            // ...
            catch (Exception ex)
            {
                WriteLog("Update error. ERR: " + ex.Message + Environment.NewLine + ex);
            }
        }
 
        private static void CreateSCR()
        {
            try
            {
                var SCR = new Bitmap(2000, 2000, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
                var SCRrs = new Bitmap(SCR,
                    new Size(Convert.ToInt32(SCR.Width * 0.8), Convert.ToInt32(SCR.Height * 0.8)));
                if (true)
                    SCRrs = new Bitmap(getGrey(SCRrs));
                SCR.Dispose();
                SCRrs.Dispose();
            }
            catch (Exception ex)
            {
                WriteLog("Creation error. ERR: " + ex.Message);
            }
        }
 
        private static Bitmap getGrey(Bitmap bmp)
        {
            try // Функция преобразования цветного изображения в оттенки серого
            {
                // ...
                return bmp;
            }
            catch (Exception ex)
            {
                WriteLog("Conversion error. ERR: " + ex.Message);
                return null /* TODO Change to default(_) if this is not a reference type */;
            }
        }
 
        private static string GetJsonFile(string url)
        {
            using (var client = new WebClient())
            {
                try
                {
                    client.Headers.Set("Authorization", "OAuth " + "YDToken");
                    var responseBody = client.DownloadString(url);
                    return responseBody;
                }
                catch (WebException e)
                {
                    WriteLog("Error: " + e.Message);
                    return string.Empty;
                }
            }
        }
    }
}



А вот код на VB.Net:

25.01.22 21:07:37 Update error. ERR: An exception has occurred.
System.Exception: An exception has occurred.
в ConsoleApp2.Module1.UpdateCheck() в R:\ConsoleApp1\ConsoleApp2\Module1.vb:ст рока 41
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
22.01.2025, 19:16
GC.WaitForPendingFinalizers() помогает
1
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
22.01.2025, 20:52  [ТС]
I can, Rius, да, это действительно помогло. Спасибо!
Также помогло максимально избавиться от процедур - запихнуть почти всё в Main. Читаемость не очень, конечно. И память больше жрет изначально, но работает. В общем странно это всё.
0
Эксперт .NET
 Аватар для Rius
13205 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,575
Записей в блоге: 14
22.01.2025, 20:54
А однократным выделением памяти не удастся обойтись?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2025, 20:54
Помогаю со студенческими работами здесь

Утечка памяти
Где я допустил ее(утечку)? #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <string> ...

Утечка памяти
Всем привет! написал обычный стэк на си++. проверка с помощью valgrind показывает вот такой результат Different size: output: 38, correct:...

Утечка памяти
Есть ли в Delphi 6 встроенные глюки, из-за которых может возникать утечка памяти? Конкретно использую указатели на записи и на динамические...

Утечка памяти
У меня Windows 7 Максимальная, и с Локального диска С то исчезнет несколько метров то появится иногда гигабайтоми небльшими что делать?????

Утечка памяти
Друзья, у меня все работает. Вот только не пойму почему приложение в памяти с каждым часом прирастает на 1 Мб. Просто служба без форм и...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru