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

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

20.01.2025, 19:15. Показов 2888. Ответов 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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
20.01.2025, 23:19
Студворк — интернет-сервис помощи студентам
Это не победил, а добавил ещё больше костылей.
0
sleep
 Аватар для I can
4914 / 4538 / 837
Регистрация: 13.04.2015
Сообщений: 9,669
20.01.2025, 23:20
Цитата Сообщение от Dim_en Посмотреть сообщение
Application.DoEvents()
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
21.01.2025, 08:02
Я выше привёл код, который получает файл или обрабатывает исключение без утечек памяти.
Сборщик мусора вам вызывать не нужно. Если думаете, что нужно, в коде наверняка косяк.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
21.01.2025, 08:30  [ТС]
Rius, я ответил, что этот код не помог. Еще раз поясняю, что (по моим соображениям) утечка не в скачивании файла, а в том, что после появления исключения перестает работать сборщик. А когда он не работает, то другая часть кода, обрабатывающая картинки, приводит к краху, т.к. заканчивается память. До исключения все работает прекрасно, даже без вызова сборщика.
0
Эксперт .NET
 Аватар для Rius
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 14
21.01.2025, 08:41
Значит, ошибка не в нём.
Приводите код, воспроизводящий проблему.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
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
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
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
sleep
 Аватар для I can
4914 / 4538 / 837
Регистрация: 13.04.2015
Сообщений: 9,669
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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
13023 / 7588 / 1661
Регистрация: 25.05.2015
Сообщений: 23,072
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru