2015-11-30 6 views
0

У меня есть вопрос о WebktGTK.WebKitGTK о webkit_web_view_load_uri

В настоящее время я делаю программу, которая может анализировать веб-страницу, если есть подозрительный веб-контент.

Когда « нагрузка не удалось » «нагрузка изменились» сигнал излучаются с WEBKIT_LOAD_FINISHED, Программы anlaysis следующей страницы непрерывно вызывая webkit_web_view_load_uri снова снова.

(http://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebView.html#webkit-web-view-load-uri)

вопрос хочу спросить вас проблема памяти. Чем больше программа анализирует веб-страницы, тем больше WebKitWebProcess больше.

webkit_back_forward_list_get_length() возвращаемое значение также увеличивается путем анализа веб-страниц. Где я освобождаю память?

Знаете ли вы, как я могу решить эту проблему или Могу дать мне какой-либо совет, где я могу получить совет?

Большое спасибо :-) Хорошего дня ^^

ответ

1

В теории, что вы делаете, это прекрасно, и вы не должны изменять свой код на всех. На практике WebKit имеет много утечек памяти, и программная загрузка многих новых URI в одном и том же веб-представлении в конечном итоге будет проблематичной, как вы нашли.

Моя рекомендация периодически, каждый раз загружать страницы, создавать новые веб-представления, которые используют отдельный веб-процесс, и уничтожать исходный веб-просмотр. (Это также сбросит список «назад/вперед», чтобы остановить его от роста, хотя я подозреваю, что потеря памяти в списке «назад/вперед», вероятно, невелика по сравнению с утечками памяти при рендеринге страницы.) Я подал Bug 151203 - [GTK] Start a new web process when calling webkit_web_view_load functions?, чтобы подумать об этом автоматически; ваша проблема указывает на то, что нам может понадобиться приоритет. В то же время, вы должны сделать это вручную:

  • Прежде чем делать что-нибудь еще в вашем приложении, установите модель процесса в WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES с помощью webkit_web_context_set_process_model(). (Если вы не создаете свой собственный веб-контекст, вам нужно использовать контекст веб-контекста webkit_web_context_get_default().)
  • Периодически уничтожайте веб-представление с помощью gtk_widget_destroy(), а затем создайте новый, используя webkit_web_view_new() et. и др. и прикрепите его где-нибудь в иерархии виджетов. (Убедитесь, что не использовать webkit_web_view_new_with_related_view(), как это, как вы получите два веб-просмотрах использовать один и тот же веб-процесс.)

Если у вас возникли проблемы при получении, что решение работать, крайняя альтернатива будет периодически отправлять SIGTERM к вашему веб-процесс, чтобы получить новый. Подключитесь к WebKitWebView::web-process-crashed и звоните webkit_web_view_load_uri() оттуда. Это приведет к тому же веб-представлению с использованием нового веб-процесса.

+0

Благодарим за подробный ответ. – guest

Смежные вопросы