WebKitGTK 关于 webkit_web_view_load_uri
WebKitGTK about webkit_web_view_load_uri
我有一个关于 WebktGTK 的问题。
最近在做一个程序,如果有可疑的网页内容,可以分析网页。
当“load-failed”"load-changed" 信号与 WEBKIT_LOAD_FINISHED 一起发出时,
程序通过再次调用 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() return 值也通过分析网页增加了。我应该在哪里释放内存?
你知道我怎样才能解决这个问题,或者可以给我任何建议吗?我在哪里可以得到建议?
非常感谢你:-)祝你有愉快的一天^^
从理论上讲,您所做的一切都很好,您根本不需要更改代码。在实践中,WebKit 有很多内存泄漏,并且在同一个 Web 视图中以编程方式加载许多新的 URI 最终会出现问题,正如您所发现的。
我的建议是定期地,每隔这么多页面加载,创建一个使用单独网络进程的新网络视图,并销毁原始网络视图。 (这也将重置 back/forward 列表以阻止它增长,尽管我怀疑丢失到 back/forward 列表的内存与呈现页面时的内存泄漏相比可能并不重要。)我提交了 Bug 151203 - [GTK] Start a new web process when calling webkit_web_view_load functions? 考虑让这一切自动发生;您的问题表明我们可能需要提高优先级。同时,您必须手动执行此操作:
- 在您的应用程序中执行任何其他操作之前,请使用
webkit_web_context_set_process_model()
将流程模型设置为 WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES
。 (如果您不创建自己的网络上下文,则需要使用默认网络上下文 webkit_web_context_get_default()
。)
- 定期使用
gtk_widget_destroy()
销毁您的 Web 视图,然后使用 webkit_web_view_new()
等创建一个新视图。阿尔。并将其附加到您的小部件层次结构中的某个位置。 (一定不要使用 webkit_web_view_new_with_related_view()
,因为这是让两个 Web 视图使用相同 Web 进程的方式。)
如果您无法使用该解决方案,一个极端的替代方法是定期将 SIGTERM 发送到您的 Web 进程以获取新的。连接到 WebKitWebView::web-process-crashed
,然后从那里调用 webkit_web_view_load_uri()
。这将导致使用新网络进程的相同网络视图。
我有一个关于 WebktGTK 的问题。
最近在做一个程序,如果有可疑的网页内容,可以分析网页。
当“load-failed”"load-changed" 信号与 WEBKIT_LOAD_FINISHED 一起发出时,
程序通过再次调用 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() return 值也通过分析网页增加了。我应该在哪里释放内存?
你知道我怎样才能解决这个问题,或者可以给我任何建议吗?我在哪里可以得到建议?
非常感谢你:-)祝你有愉快的一天^^
从理论上讲,您所做的一切都很好,您根本不需要更改代码。在实践中,WebKit 有很多内存泄漏,并且在同一个 Web 视图中以编程方式加载许多新的 URI 最终会出现问题,正如您所发现的。
我的建议是定期地,每隔这么多页面加载,创建一个使用单独网络进程的新网络视图,并销毁原始网络视图。 (这也将重置 back/forward 列表以阻止它增长,尽管我怀疑丢失到 back/forward 列表的内存与呈现页面时的内存泄漏相比可能并不重要。)我提交了 Bug 151203 - [GTK] Start a new web process when calling webkit_web_view_load functions? 考虑让这一切自动发生;您的问题表明我们可能需要提高优先级。同时,您必须手动执行此操作:
- 在您的应用程序中执行任何其他操作之前,请使用
webkit_web_context_set_process_model()
将流程模型设置为WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES
。 (如果您不创建自己的网络上下文,则需要使用默认网络上下文webkit_web_context_get_default()
。) - 定期使用
gtk_widget_destroy()
销毁您的 Web 视图,然后使用webkit_web_view_new()
等创建一个新视图。阿尔。并将其附加到您的小部件层次结构中的某个位置。 (一定不要使用webkit_web_view_new_with_related_view()
,因为这是让两个 Web 视图使用相同 Web 进程的方式。)
如果您无法使用该解决方案,一个极端的替代方法是定期将 SIGTERM 发送到您的 Web 进程以获取新的。连接到 WebKitWebView::web-process-crashed
,然后从那里调用 webkit_web_view_load_uri()
。这将导致使用新网络进程的相同网络视图。