Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Работа с памятью и Store / 23 сообщений из 23, страница 1 из 1
24.04.2017, 11:21
    #39443130
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Добрый день, товарищи!

Делаю вэб приложение на ASP.NET+ EXT.NET.

В приложении много такого вида кода, где привязываю данные из БД к гридам

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 protected void getExpInfo(object sender, StoreReadDataEventArgs e)
    {

        int? sotrud = JSON.Deserialize<int?>(e.Parameters["sotrud"]);
        DateTime dt1 = Convert.ToDateTime(e.Parameters["dt1"]);
        DateTime dt2 = Convert.ToDateTime(e.Parameters["dt2"]);
        string analitik = e.Parameters["analitik"];         

        Store store = sender as Store;
        DataTable dt = DatabaseAdapterUser.getExpInfo(analitik, sotrud, dt1, dt2);

        store.DataSource = dt;
        store.DataBind();

    }



Проблема в том что после каждой такой процедуры занимаемая память на сервере растет, вплоть до полного объема памяти.

Посоветуйте, пожалуйста, как в таких случаях нужно освобождать память.

Пожалуйста, сильно не пинайте, если это просто и не достойно быть отдельной темой. Я реально ни разу не работал с памятью в ASP.NET и прибывал в наивной уверенности, что система сама все сделает.
...
Рейтинг: 0 / 0
24.04.2017, 11:52
    #39443150
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
а почему ты думаешь, что проблема именно тут?
...
Рейтинг: 0 / 0
24.04.2017, 12:16
    #39443164
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkin,

профайлером его, профайлером, фас!
...
Рейтинг: 0 / 0
24.04.2017, 13:24
    #39443248
german23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
гарбаджколлектор.коллект()

GC.Collect();
...
Рейтинг: 0 / 0
24.04.2017, 16:08
    #39443418
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
german23,

Сделал вот так, но проблема не решилась. Верно ли использовал GC.Collect();?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 
 protected void getExpInfo(object sender, StoreReadDataEventArgs e)
    {

        int? sotrud = JSON.Deserialize<int?>(e.Parameters["sotrud"]);
        DateTime dt1 = Convert.ToDateTime(e.Parameters["dt1"]);
        DateTime dt2 = Convert.ToDateTime(e.Parameters["dt2"]);
        string analitik = e.Parameters["analitik"];         

        Store store = sender as Store;
        DataTable dt = DatabaseAdapterUser.getExpInfo(analitik, sotrud, dt1, dt2);

        store.DataSource = dt;
        store.DataBind();

        GC.Collect();

    }
...
Рейтинг: 0 / 0
24.04.2017, 16:08
    #39443422
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
hVostt,
подскажи, пожалуйста, более точнее. Каким именно профайлером?
...
Рейтинг: 0 / 0
24.04.2017, 16:11
    #39443426
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
handmadeFromRu,
Выяснил опытным путем.
Открыл Диспетчер задач, там процесс w3wp.exe
Начал делать разные действия в приложении.

В итоге при обновлении любых сторов у которых код как в примере или даже проще без параметров, у процесса w3wp.exe
увеличивается память от +1 мб до +20 мб.

Так за несколько щелчков память достигает предела
...
Рейтинг: 0 / 0
24.04.2017, 17:19
    #39443507
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Давай код DatabaseAdapterUser.getExpInfo().
...
Рейтинг: 0 / 0
24.04.2017, 17:58
    #39443544
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
НахлобучДавай код DatabaseAdapterUser.getExpInfo().
Вот код
Код: 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.
 
 public static DataTable getExpInfo(string analitik, int? sotrud, DateTime dt1, DateTime dt2)
        {
            SqlConnection sqlConnection = DatabaseAdapterUser.GetSqlConnection();
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "getExpInfo";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@analitik", analitik);
            cmd.Parameters.AddWithValue("@sotrud", sotrud);
            cmd.Parameters.AddWithValue("@dt1", dt1);
            cmd.Parameters.AddWithValue("@dt2", dt2);          

            cmd.Connection = sqlConnection;

            sqlConnection.Open();
            DataTable dataTable = new DataTable();

            dataTable.Load(cmd.ExecuteReader());

            sqlConnection.Close();

            return dataTable;
        }
...
Рейтинг: 0 / 0
24.04.2017, 18:10
    #39443551
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Решето же. Для начала попробуйте так:

Код: 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.
public static DataTable getExpInfo(string analitik, int? sotrud, DateTime dt1, DateTime dt2)
{
    var dataTable = new DataTable();

    using(var sqlConnection = DatabaseAdapterUser.GetSqlConnection())
    using(var cmd = new SqlCommand())
    {
        sqlConnection.Open();

        cmd.Connection = sqlConnection;

        cmd.CommandText = "getExpInfo";
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.AddWithValue("@analitik", analitik);
        cmd.Parameters.AddWithValue("@sotrud", sotrud);
        cmd.Parameters.AddWithValue("@dt1", dt1);
        cmd.Parameters.AddWithValue("@dt2", dt2);

        using(var dataReader = cmd.ExecuteReader())
            dataTable.Load(dataReader);
    }

    return dataTable;
}
...
Рейтинг: 0 / 0
24.04.2017, 18:17
    #39443559
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Нахлобуч, мил-человек
по твоей наводке попробовал сделать так
Код: 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.
 public static DataTable getExpInfo(string analitik, int? sotrud, DateTime dt1, DateTime dt2)
        {
            SqlConnection sqlConnection = DatabaseAdapterUser.GetSqlConnection();
            SqlCommand cmd = new SqlCommand();

            cmd.CommandText = "getExpInfo";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@analitik", analitik);
            cmd.Parameters.AddWithValue("@sotrud", sotrud);
            cmd.Parameters.AddWithValue("@dt1", dt1);
            cmd.Parameters.AddWithValue("@dt2", dt2);

            cmd.Connection = sqlConnection;

            sqlConnection.Open();
            DataTable dataTable = new DataTable();

            dataTable.Load(cmd.ExecuteReader());

            sqlConnection.Close();

            try
            {
                return dataTable;
            }
            finally
            {
                cmd = null;
                dataTable = null;
                GC.Collect();
            } 
             
        }



Потестил уже вроде как лучше стало. Сейчас до дома доеду и попробую твой код. Отпишусь
...
Рейтинг: 0 / 0
24.04.2017, 18:54
    #39443581
german23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
диспозить надо конечно, ай ай ай
...
Рейтинг: 0 / 0
24.04.2017, 18:56
    #39443582
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkinНахлобуч, мил-человек
по твоей наводке попробовал сделать так
Почему не сделать ровно так, как я предложил?
...
Рейтинг: 0 / 0
24.04.2017, 19:15
    #39443590
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Нахлобуч, сделаю как предложили, просто уже на радостях домой поехал с работы. Отпишусь по итогу
...
Рейтинг: 0 / 0
24.04.2017, 22:40
    #39443700
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Нахлобуч
Почему не сделать ровно так, как я предложил?
Эх, что то я рано порадовался. Сделал как вы написали, но так же использование памяти безконтрольно растет. Мой код так же. Просто выдал желаемое за действительное.

Может еще есть идеи как разобраться с этим?
...
Рейтинг: 0 / 0
24.04.2017, 23:03
    #39443713
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkin Верно ли использовал GC.Collect();?
нет, конечно.

используй к примеру http://jetbrains.ru/products/dotmemory/

п.с. ты прям четко определил место в своем проекте что именно тут течет память - меня удивило, учитывая что ты не понимаешь как работает сборщик мусора.

п.с. то что тебе посоветовал Нахлобуч 100% работает, что у тебя внутри DatabaseAdapterUser.GetSqlConnection() ? при условии конечно что именно этот твой метод течет что я сомневаюсь
...
Рейтинг: 0 / 0
24.04.2017, 23:09
    #39443716
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkinhandmadeFromRu,
Выяснил опытным путем.
Открыл Диспетчер задач, там процесс w3wp.exe
Начал делать разные действия в приложении.

В итоге при обновлении любых сторов у которых код как в примере или даже проще без параметров, у процесса w3wp.exe
увеличивается память от +1 мб до +20 мб.

Так за несколько щелчков память достигает предела
дык код который нахлобуч тебе написал надо везде использовать где соединения с бд
если у тебя не закрывались соединения то у тебя ошибка кол-ва доступных соединений вылетела бы раньше чем память кончилась имхо, ну если у тебя там не впритык оперативки.
п.с. сборщик мусора не сразу очищает за собой ресурсы..то что прирост идет эт нормально, вопрос только насколько прирост
п.с. п.с. диспетчер винды ваще крайне плохой показатель ...даж встроенный в вижлу профилировщик и то информативнее
...
Рейтинг: 0 / 0
24.04.2017, 23:11
    #39443717
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
handmadeFromRu что у тебя внутри DatabaseAdapterUser.GetSqlConnection() ? при условии конечно что именно этот твой метод течет что я сомневаюсь
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public static SqlConnection GetSqlConnection()
        {
            return new SqlConnection(DatabaseAdapterUser.ConnectionString);
        }

public static string ConnectionString
        {
            get
            {
                object value = HttpContext.Current.Session["ConnectionStrings"];

                if (value != null)
                {
                    return Convert.ToString(value);
                }
                return null;
            }
        }


Вот что внутри DatabaseAdapterUser.GetSqlConnection()
...
Рейтинг: 0 / 0
24.04.2017, 23:21
    #39443721
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
handmadeFromRu
используй к примеру http://jetbrains.ru/products/dotmemory/

Да, установил dotmemory, сел разбираться.
...
Рейтинг: 0 / 0
25.04.2017, 09:17
    #39443835
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkin,

ну вот прокачаетесь когда найдете учетку памяти, заодно передавайте привет разработчикам кода и их полной не компетенции

п.с. улыбнуло хранение строки соединения в сессии
...
Рейтинг: 0 / 0
25.04.2017, 12:26
    #39443989
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
Спасибо вам добрые люди! Нашел главную дыру куда память уходила. Им оказался FastReport - генератор отчетов.

Нашел с помощью dotMemory - отличная программа.

handmadeFromRu, передать привет некому, сам и певец и жнец и на дуде игрец.
Подскажи, пожалуйста, чем плохо хранение строки соединения в сессии и как лучше делать?
...
Рейтинг: 0 / 0
25.04.2017, 12:48
    #39444005
handmadeFromRu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
ilshatkinПодскажи, пожалуйста, чем плохо хранение строки соединения в сессии и как лучше делать?
ну а смысл какой? у тебя что для каждой сессии свой конекшен ?
обычно из конфиг файла, он в памяти всегда висит пока сайт работает.
Код: c#
1.
ConfigurationManager.ConnectionStrings["somename"].ConnectionString



рекомендую еще посмотреть в сторону dapper.net, если у тебя голый sql, упростит маппинг на объекты.
...
Рейтинг: 0 / 0
25.04.2017, 12:59
    #39444018
ilshatkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с памятью и Store
handmadeFromRuilshatkinПодскажи, пожалуйста, чем плохо хранение строки соединения в сессии и как лучше делать?
ну а смысл какой? у тебя что для каждой сессии свой конекшен ?
обычно из конфиг файла, он в памяти всегда висит пока сайт работает.
Код: c#
1.
ConfigurationManager.ConnectionStrings["somename"].ConnectionString



рекомендую еще посмотреть в сторону dapper.net, если у тебя голый sql, упростит маппинг на объекты.

Ну как какой, у меня на самом деле не сайт, а сервис и после авторизации у каждого пользователя/пользователей своя база данных к которой он и цепляется.

dapper.net погляжу, спасибо
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Работа с памятью и Store / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]