0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
1

Освобождение оперативной памяти при использовании Awesomium

08.03.2015, 12:12. Показов 2728. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Работаю с Awesomium, и всё было хорошо, пока я не открыл диспетчер задач. После обновления страниц в нем постоянно растет занимаемая оперативная память, проще говоря, за 5 минут с 20МБ, он способен занять 900МБ. Google Мне ответа не дал.
Попробовал .Dispose(), но тогда возникает вопрос, как восстановить WebControl. Проще говоря, после вызова .Dispose() webControl перестает функционировать воообще. Help
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 12:12
Ответы с готовыми решениями:

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

Освобождение памяти
Есть форма, из которой вызывается дочерняя форма, на дочерней форме есть пикчербокс, так вот, при...

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

Освобождение памяти после выполнения SQL запроса
Моя программа последовательно выполняет простые запросы к двум БД, извекая из них нужные записи. Не...

13
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2015, 15:01 2
Danil C, нужно правильно освобождать ресурсы у всех объектов с IDisposable, бедный webcontrol вряд ли виноват.
1
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
09.03.2015, 15:56  [ТС] 3
МБ я чего-то не понял в вашем совете, но сама программа ресурсы не ест(вернее не так много как браузеры), прикладываю скриншот, что бы вы поянли что происходит.
Наибольшее кол-во памяти занимает наиболее часто-обновляемый браузер.
Миниатюры
Освобождение оперативной памяти при использовании Awesomium  
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2015, 18:37 4
Danil C, а зачем вам куча разных процессов? В этом есть смысл или они просто плодятся?
1
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
09.03.2015, 18:40  [ТС] 5
Возможно от 2х можно избавится, я просто сейчас сидел на форумах и пришла идея как избавится, но это не меняет того факта что в остальных по непонятным причинам растёт память. У вас есть какие нибудь идеи, как ее освободить?
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2015, 22:47 6
Danil C, ну а что можно посоветовать не имея кода на руках? Только общие советы а-ля "очищайте ресурсы" и остаются.
1
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
11.03.2015, 00:13  [ТС] 7
Psilon, Да, вы правы. Вот собственно код. Последние строки - моя попытка очистить память. Без результата.
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
private void Awesomium_Windows_Forms_WebControl_DocumentReady(object sender, Awesomium.Core.DocumentReadyEventArgs e)
        {
            if (vkat.IsDocumentReady == true)
            {
                if (vkat.Title == "Welcome! | VK")
                {
                    dynamic document = (JSObject)vkat.ExecuteJavascriptWithResult("document");
                    if (document == null)
                        return;
                    using (document)
                    {
                        dynamic number = document.getElementById("quick_email");
 
                        if (number == null)
                            return;
 
                        using (number)
                            number.value = "number";
 
                        dynamic pass = document.getElementById("quick_pass");
 
                        if (pass == null)
                            return;
 
                        using (pass)
                            pass.value = "pass";
 
 
                        dynamic log = document.getElementById("quick_login_button");
 
                        if (log == null)
                            return;
 
                        using (log)
                            log.Invoke("click");
                        document = null;
                        number = null;
                        pass = null;
                        log = null;
                    }
                }
                if (vkat.Title == "NAME NAME")
                {
                    this.vkat.Source = new System.Uri("http://vk.com/im?sel=id", System.UriKind.Absolute);
                    this.vkmessa.Source = new System.Uri("http://vk.com/im?sel=id", System.UriKind.Absolute);
                }
                if (vkat.Title == "Диалоги")
                {
                    var html = vkat.ExecuteJavascriptWithResult("document.documentElement.outerHTML").ToString();
                    var doc = new hdoc();
                    doc.LoadHtml(html);
 
                    HtmlNodeCollection elem;
                    
                    elem = doc.DocumentNode.SelectNodes("//div[@class='im_msg_text']");
                    if (elem != null)
                    {
                        if (messe != null)
                        {
                            if (elem.ElementAt(elem.Count - 1).InnerText != messe.ElementAt(messe.Count - 1).InnerText)
                            {
                                this.vkmessa.Source = new System.Uri("http://vk.com/im?sel=id", System.UriKind.Absolute);
                            }
                        }
                    }
                    html = null;
                    doc = null;
                    elem = null;
 
                    timer1.Enabled = true;
 
                }
            }
        }
 
        private void timer1_Tick_1(object sender, EventArgs e)
        {
            vkat.Reload(false);
                timer1.Enabled = false;
        }
Таймер обновляет страницу. После обновления получается, что память возрастает.
0
burning1ife
1461 / 1283 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
11.03.2015, 01:01 8
Присвивание null не очищает память, только Dispose
Вот интересная статья http://habrahabr.ru/post/129283/
1
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.03.2015, 01:03 9
Danil C, ну так вы их не освобождаете. Освобождение - это не присвоение null, а dispose. Например:
C#
1
dynamic document = (JSObject)vkat.ExecuteJavascriptWithResult("document");
во-первых делаете дайнэмик - без необходимости этого делать нельзя - вы же знаете конечный тип.
Во-вторых вы не вызываете dispose, хотя по спекам очевидно, что он должен быть:
http://docs.awesomium.net/html... Object.htm

Вывод:
C#
1
2
3
4
using(var document = (JSObject)vkat.ExecuteJavascriptWithResult("document"))
{
   // some stuff here
}
и так со всеми создаваемыми объектами.

Добавлено через 1 минуту
юзинг нужно использовать сразу при создании, потому что иначе возможны нюансы.
1
burning1ife
1461 / 1283 / 293
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
11.03.2015, 01:03 10
С какой задержкой срабатывает таймер? Я подозреваю, что она очень маленькая, и получение страницы происходит быстрее чем парсинг. Отсюда накапливаются большие расходы.
1
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
11.03.2015, 01:09 11
kenny69, да, точно. Таймер надо отключать ДО начала обработки, а не после неё
1
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
12.03.2015, 00:29  [ТС] 12
Psilon, Используя вашу идею у меня получилось лишь снизить кол-во ресурсов, которые прибавляются каждый раз. То есть, рост теперь идет медленней.
Избавиться от dynamic Я просто не знаю как. Когда я пишу var вылезает ошибка.
На счет таймера, честно говоря не понял замечания. Таймер обновляет страницу, отключается, когда парсинг заканчивается таймер снова включается.
Более того, увелечение ресурсов скорее всего происходит из-за того кода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (vkat.Title == "Диалоги")
                {
                    var html = vkat.ExecuteJavascriptWithResult("document.documentElement.outerHTML");
                    var doc = new hdoc();
                    doc.LoadHtml(html);
 
                    HtmlNodeCollection elem;
                    
                    elem = doc.DocumentNode.SelectNodes("//div[@class='im_msg_text']");
                    if (elem != null)
                    {
                        if (messe != null)
                        {
                            if (elem.ElementAt(elem.Count - 1).InnerText != messe.ElementAt(messe.Count - 1).InnerText)
                            {
                                this.vkmessa.Source = new System.Uri("http://vk.com/im?sel=id", System.UriKind.Absolute);
                            }
                        }
                    }
Т.к остальная часть кода просто не достижима. Значит и ресурсы возрастают из-за этого. Виной тому, как я понимаю
C#
1
var html = vkat.ExecuteJavascriptWithResult("document.documentElement.outerHTML");
Но возникает другой вопрос, что с ним делать, ведь .Dispose() он не поддерживает.
Миниатюры
Освобождение оперативной памяти при использовании Awesomium  
0
Master of Orion
Эксперт .NET
6094 / 4950 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.03.2015, 01:01 13
Лучший ответ Сообщение было отмечено Psilon как решение

Решение

Danil C, утечка может быть ТОЛЬКО если вы где-то ресурсы не закрываете. Наверное стоит в профайлере посмотреть, он покажет, какие объекты и где текут. У сборщика ресурсы никогда не растут

Добавлено через 1 минуту
ну и да, приравнивание null не делает абсолютно ничего

Добавлено через 1 минуту
Danil C, ну и нужно учитывать, что часть утечек может быть внутри самой либы:
http://answers.awesomium.com/q... leaks.html

но в этом случае вы ничего сделать не можете, да и маловероятно это, так что сначала весь свой код причешите.
2
0 / 0 / 0
Регистрация: 07.01.2015
Сообщений: 19
15.03.2015, 22:30  [ТС] 14
Psilon, спасибо большое. Так и не понял в чем проблема была, но решил переписать код. Выяснилось что память почему-то возрастает при самом обновлении. Не много погуглив нашёл, что проблема встречалась у многих кто использовал последнюю версию SDK, в итоге решил удалить и поставить версию 1.7 и о слава Иисусу и Аллаху код заработал и память перестала возрастать.
Спасибо большое за ваши советы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2015, 22:30
Помогаю со студенческими работами здесь

Освобождение памяти при очистке ContentControl
Добрый день! Ситуация следующая, динамически создаю некотрый userControl, помещаю его в...

Утечка памяти в Awesomium WebControl
Всем привет. Использую в качестве встроенного браузера Awesomium, но вот проблема, уже страниц...

Освобождение памяти, как это сделать?
К примеру такой код private void Func() { var a = new Var(); //TODO } Так вот,...

Ошибка при использовании Awesomium
В первый раз использую в своем приложении Awesomium... При старте приложения запускается таймер,...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru