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

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

20.01.2025, 19:15. Показов 2866. Ответов 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
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 19:32

Не по теме:

Не надо использовать яндекс диск для обновлений.



Профайлер что-то показывает?
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 19:47  [ТС]
Rius, если что - я нуб без профильного образования, самоучка. Потому прошу отнестись соответственно - снисходительно Профайлер - что это? По обновлениям - это очень мелкий проект, мне этого хватает. Но убивает утечка памяти. Кстати, такое впечатление, что сборщик просто перестает работать. Если убрать CG.Collect, то сборщик работает сам, позволяя немного распухнуть приложению. А после проверки обновления - перестает. В конце концов настает нехватка ресурсов для работы программы.
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 19:50
Цитата Сообщение от Dim_en Посмотреть сообщение
Профайлер - что это?
Средства диагностики. Чтобы посмотреть, что тормозит и куда утекает память.
Знакомство со средствами профилирования (C#, Visual Basic, C++, F#)
Миниатюры
Утечка памяти в веб-запросах  
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4356 / 3426 / 512
Регистрация: 27.01.2014
Сообщений: 6,257
20.01.2025, 20:02
А зачем Яндекс? Заведите себе бесплатный (в ЛС могу подсказать, чтоб не считалось рекламой) пожизненный хостинг на 1ГБ, и кидайте обновления туда. Денег не просит, зато удобно. И думаю, все проблемы с памятью сами пропадут.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 20:08  [ТС]
Rius, кажется, что в моем экспресс-выпуске VB2010 такого не завезли.

Добавлено через 6 минут
Yury Komar, да, можно рассмотреть и такой вариант. Я просто думал, что это мой косяк, хотел понять свою ошибку.
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 20:22
Берёте какой-нибудь большой файл, доступный по http, пытаетесь скачать и смотрите, у вас ошибка или нет.
Например,
https://releases.ubuntu.com/no... -amd64.iso
https://releases.ubuntu.com/no... -amd64.iso
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 20:45  [ТС]
Rius, дело не в том, что оно не качает update. Качает и ставит (да и размеры там килобайтные). Но чаще этого файла нет на ЯДиске, и этот факт порождает исключение. Сначала это меня не беспокоило, я же его обрабатываю. А потом понял, что после этого перестает работать сборщик мусора, а потом и проге кранты. Попробую переписать на FTP.
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 20:55
Цитата Сообщение от Dim_en Посмотреть сообщение
и этот факт порождает исключение
Вот так ?

0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 21:07
Попробуйте вместо запроса/ответа/потока:
C#
1
string JSONanswer = GetJsonFile("https://releases.ubuntu.com/1.json"); // вставьте ваш url
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static string GetJsonFile(string url)
{
    using (WebClient client = new WebClient())
    {
        try
        {
            string responseBody = client.DownloadString(url);
            return responseBody;
        }
        catch (WebException e)
        {
            Console.WriteLine("Error: " + e.Message);
            return string.Empty;
        }
    }
}
Добавлено через 7 минут
Цитата Сообщение от Dim_en Посмотреть сообщение
и этот факт порождает исключение
...
Code
1
{"Выдано исключение типа \"System.OutOfMemoryException\"."}
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 21:36  [ТС]
Rius, вынес запрос на скачивание в функцию. Результат тот-же. После получения исключения "Удаленный сервер возвратил ошибку: (404) Не найден." начинает расти память на обработке изображений.
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 21:37
Код покажите.
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 22:10  [ТС]
Rius,
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
Private Sub UpdateCheck()
            If GetUpdate() Then
                WriteLog("Update received. Start of update...")
                'Распаковка
            End If
End Sub
 
Private Function GetUpdate() As Boolean
        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 из ответа
                WebCl.DownloadFile(New Uri(UpLink), ArchUpd) 'Скачивание файла по ссылке
                GetUpdate = True
            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
            WriteLog("Update error. ERR: " & ex.Message)
            GetUpdate = False
        End Try
End Function
Пробовал FTP. Там аналогично, при получении исключения перестает работать сборщик мусора. Другие исключения к этому не приводят.
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 22:18
В 10 посте я привёл функцию запроса JSON с сервера вместо HttpWebRequest/HttpWebResponse/Stream ... для кого?

Добавлено через 5 минут
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Private Shared Function GetJsonFile(ByVal url As String) As String
    Using client As WebClient = New WebClient()
 
        Try
            Dim responseBody As String = client.DownloadString(url)
            Return responseBody
        Catch e As WebException
            Console.WriteLine("Error: " & e.Message)
            Return String.Empty
        End Try
    End Using
End Function
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 22:21  [ТС]
Rius, таки я не понял, а куда там пихать токен?
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 22:24
Вы таки не поверите, туда же, в headers!
WebClient.Headers Свойство
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 22:56  [ТС]
Rius, результат тот-же. Наверно проще сделать отдельное приложение для всего этого. С его закрытием и все утечки уйдут.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim JSONanswer As String = GetJsonFile("https://cloud-api.yandex.net/v1/disk/resources/download?path=app:/update.rar&fields=href")
WriteLog(JSONanswer)
 
Private Function GetJsonFile(ByVal url As String) As String
        Using client As WebClient = New WebClient()
            Try
                client.Headers.Set("Authorization", "OAuth " & YDToken)
                Dim responseBody As String = client.DownloadString(url)
                Return responseBody
            Catch e As WebException
                WriteLog("Error: " & e.Message)
                Return String.Empty
            End Try
        End Using
End Function
0
Эксперт .NET
 Аватар для Rius
13019 / 7585 / 1660
Регистрация: 25.05.2015
Сообщений: 23,052
Записей в блоге: 14
20.01.2025, 23:09
И это падает?
В логе что выводится?

Добавлено через 4 минуты
Я этот код запускаю и вижу ошибку:
  • Без токена - ошибка авторизации.
  • Левый адрес, где файла никакого нет - 404, файл не найден.
И память никуда не утекает.

Добавлено через 5 минут
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
using System;
using System.Net;
 
namespace ConsoleApp2
{
    public class Sample2
    {
        private static void Main(string[] args)
        {
            var JSONanswer =
                GetJsonFile("https://cloud-api.yandex.net/v1/disk/resources/download?path=app:/update.rar&fields=href");
            WriteLog(JSONanswer);
 
            JSONanswer = GetJsonFile("https://releases.ubuntu.com/noble/ubuntu-24.04.1-live-server-amd64.json");
            WriteLog(JSONanswer);
 
            JSONanswer = GetJsonFile("https://cyberstatic.net/clientscript/vbulletin_menu.js");
            WriteLog(JSONanswer);
        }
 
        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;
                }
            }
        }
 
        private static void WriteLog(string value)
        {
            Console.WriteLine(value);
        }
    }
}
Вывод:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Error: Удаленный сервер возвратил ошибку: (401) Несанкционированный.
 
Error: Удаленный сервер возвратил ошибку: (404) Не найден.
 
/*!======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.7
|| # ---------------------------------------------------------------- # ||
|| # Copyright c2000-2011 vBulletin Solutions, Inc. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/
0
sleep
 Аватар для I can
4914 / 4537 / 837
Регистрация: 13.04.2015
Сообщений: 9,669
20.01.2025, 23:10
Цитата Сообщение от Dim_en Посмотреть сообщение
на обработке изображений
А этот код где? Может в нём собака порылась?
0
20 / 13 / 7
Регистрация: 04.02.2022
Сообщений: 69
20.01.2025, 23:16  [ТС]
Rius, в логе
Code
1
2
25.01.20 23:05:47 Error: Удаленный сервер возвратил ошибку: (404) Не найден.
25.01.20 23:05:47
Но это всё не при чём. Кажется победил. В основной цикл вставил
VB.NET
1
2
3
4
Do
    '...
    Application.DoEvents()
Loop
Теперь после исключений сборщик мусора не зависает, но немного выросло потребление - до 3Мб. Тему можно закрывать. Всем спасибо за участие.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2025, 23:16
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru