1

WebktGTK について質問があります。

最近、疑わしい Web コンテンツがある場合に Web ページを分析できるプログラムを作成しています。

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 )

あなたに聞きたい質問は、メモリの問題です。プログラムが Web ページを分析すればするほど、WebKitWebProcess は大きくなります。

webkit_back_forward_list_get_length() の戻り値も Web ページを解析することで増加しました。どこでメモリを解放する必要がありますか?

この問題をどのように解決できますか、またはどこでアドバイスをもらえますか?

どうもありがとうございました:-)良い一日を^^

4

1 に答える 1

2

理論的には、あなたがしていることはまったく問題なく、コードをまったく変更する必要はないはずです。実際には、WebKit には多くのメモリ リークがあり、多くの新しい URI を同じ Web ビューにプログラムで読み込むと、最終的には問題が発生することがわかりました。

私の推奨事項は、定期的に、非常に多くのページが読み込まれるたびに、別の Web プロセスを使用する新しい Web ビューを作成し、元の Web ビューを破棄することです。(これにより、戻る/進むリストもリセットされて、それが大きくなるのを止めますが、ページをレンダリングするときのメモリ リークに比べて、戻る/進むリストで失われるメモリはおそらく重要ではないのではないかと思います。) Bug 151203 - [GTK]を提出しました。 webkit_web_view_load 関数を呼び出すときに新しい Web プロセスを開始しますか? これを自動的に行うことを検討します。あなたの問題は、その優先度を上げる必要があるかもしれないことを示しています。それまでは、手動で行う必要があります。

  • アプリケーションで何かを行う前に、プロセス モデルをWEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSESusingに設定しますwebkit_web_context_set_process_model()。(独自の Web コンテキストを作成しない場合は、デフォルトの Web コンテキストを使用する必要がありますwebkit_web_context_get_default()。)
  • で Web ビューを定期的に破棄し、 etgtk_widget_destroy()を使用して新しいビューを作成します。webkit_web_view_new()アル。ウィジェット階層のどこかにアタッチします。(webkit_web_view_new_with_related_view()これは、2 つの Web ビューで同じ Web プロセスを使用する方法であるため、使用しないでください。)

その解決策を機能させるのに問題がある場合、極端な代替手段は、Web プロセスに定期的に SIGTERM を送信して新しいものを取得することです。に接続してWebKitWebView::web-process-crashed、そこから発信webkit_web_view_load_uri()します。これにより、新しい Web プロセスを使用して同じ Web ビューが生成されます。

于 2016-01-03T02:41:50.060 に答える