C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: vb .net メモリの解放について


(過去ログ 121 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■72597 / inTopicNo.1)  vb .net メモリの解放について
  
□投稿者/ yama (1回)-(2014/06/21(Sat) 13:30:25)

分類:[.NET 全般] 

vb .net を使いサイトを巡回してデータを収集するアプリを作成しているのですが、webbrowser コントロールに URLを Navigate する度に アプリ自身のメモリが増加してしまいます。
一度動かす程度なら全く問題ないのですが、最終的には常駐アプリのようにし、常に動かし続けたいと考えています。
どうにかアプリを起動したまま、溜まったメモリを解放することは出来ないでしょうか。

宜しくお願いいたします。

環境
windows8.1 64
vb.net 2013
ie 11
引用返信 編集キー/
■72600 / inTopicNo.2)  Re[1]: vb .net メモリの解放について
□投稿者/ WebSurfer (300回)-(2014/06/21(Sat) 14:40:13)
No72597 (yama さん) に返信

MSDN ライブラリに書いてある注意事項(抜粋下記)を守ることでしょうか。

"WebBrowser は、リソースへの負荷の大きいコントロールです。コントロールの使用を終えたら、
必ず Dispose() メソッドを呼び出し、すべてのリソースを確実に解放するようにしてください。
Dispose() メソッドは、イベントを結びつけたスレッドと同じスレッドで呼び出す必要がありま
す。イベントを結びつけるスレッドは、常にメッセージ スレッドまたはユーザー インターフェ
イス (UI) スレッドのいずれかになります。"


ところで、本当に WebBrowswer コントロールである理由があるのでしょうか? 

WebBrowser は ActiveX の WebBrowser コントロール (SHDocVw.dll) のマネージラッパーで、
Windows Forms アプリで IE を表示してプログラムから操作するようなものです。

「常駐アプリのようにし、常に動かし続けたい」ということから想像すると、質問者さんが必要
なことを実現するには過剰な機能を持ち、その分重すぎるような気がします。

もしそうであれば、WenClient や HttpWebRequest/HttpWebResponse クラスの使用も検討しては
いかがでしょう。

引用返信 編集キー/
■72602 / inTopicNo.3)  Re[2]: vb .net メモリの解放について
□投稿者/ yama (2回)-(2014/06/21(Sat) 15:02:06)
WebSurfer様 回答ありがとうございます。
宜しくお願いいたします。

>>WenClient や HttpWebRequest/HttpWebResponse クラスの使用も検討してはいかがでしょう。
ページ内にjsがあり、そのjsで描写している情報もあるので、jsを処理してくれるwebbrowserを選択しました。
ieを非表示で立ち上げる仕様も考えたのですが、ゾンビ化の処理も考慮するとwebbrowserの方が楽かと思い、webbrowserになりました。

ご指摘いただいた Dispose() を実行してみたのですが、デザインに貼り付けてあった webbrowserが消えてしまいました。
これは毎回 新たな webbroser を生成する、と言うことなのでしょうか。
今までは デザインに貼り付けた webbrowser に対して Navigate を繰り返していました。

引用返信 編集キー/
■72603 / inTopicNo.4)  Re[3]: vb .net メモリの解放について
□投稿者/ WebSurfer (302回)-(2014/06/21(Sat) 16:55:08)
No72602 (yama さん) に返信
> ご指摘いただいた Dispose() を実行してみたのですが、デザインに貼り付けてあった webbrowserが消えてしまいました。
> これは毎回 新たな webbroser を生成する、と言うことなのでしょうか。
> 今までは デザインに貼り付けた webbrowser に対して Navigate を繰り返していました。

すみません。レスが舌足らずでした。

プログラマが普通にできることとしては Dispose するぐらいしかなさそうなのですが、
連続的に動かしたいと言うことですとダメですね。

また、Dispose できたとしてもそれでは効果がないケースもあって、WebBrowser を常駐
アプリで連続的に動かして使うのは、そもそもが無理っぽいようです。

[VB]WebBrowser コントロールの Navigate メソッドによるメモリリーク
http://support.microsoft.com/kb/418376/ja

(上記ページ以外にも「webbrowser」「メモリリーク」「メモリ解放」等をキーワード
にググると参考になりそうなページが見つかると思います。)

というわけで、WebClient や HttpWebRequest/HttpWebResponse を使うことを提案した
のですが・・・

24 時間ぐらいは問題なく使えるのでしょうか、それとも 20〜30 分もすると OutOfMemoryException
で落ちてしまうのでしょうか? 問題の深刻さが分かりませんが、それによって対策は
変わってくると思います。
引用返信 編集キー/
■72604 / inTopicNo.5)  Re[4]: vb .net メモリの解放について
□投稿者/ tinq (12回)-(2014/06/21(Sat) 17:26:39)
2014/06/21(Sat) 17:33:20 編集(投稿者)

調べてみましたが、確かにメモリリークが一般的に言われているようです。
jsで描画している部分は裏でJSONやXMLでやり取りをしたりしていませんか?(Chromeなどに付属の開発者用ツールなどで確認可能)
それなら、そちらを直に取得するほうがいいかもしれません。

もしくは、GeckoやWebkitのエンジンを使う、(ただし、更新が止まっているものが多いのでセキュリティなどの考慮の必要あり)別AppDomainやプロセスを使い、定期的にそれを終了/再起動させる
などでごまかすとかになるのではないでしょうか。

追伸:
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=11284&reno=no&oya=11284&mode=msgview&page=0
の投稿はyamaさんでしょうか?
向こうの掲示板ではマルチポスト禁止になっていますし、他のサイトと回答の共有ができなくて回答者が2度手間になりかねません。

あなたの投稿でないようでしたら、いたずらかもしれません。
引用返信 編集キー/
■72605 / inTopicNo.6)  Re[4]: vb .net メモリの解放について
□投稿者/ shu (598回)-(2014/06/21(Sat) 17:26:55)
常駐させるプロセスとNavigateするプロセスは分けて
常駐させるプロセスからNavigateするプロセスを起動し
ある程度Navigateしたら終了。続きは常駐させるプロセスが
新しいNavigateするプロセスを起動とすれば
なんとかなりませんか?
引用返信 編集キー/
■72606 / inTopicNo.7)  Re[5]: vb .net メモリの解放について
□投稿者/ yama (3回)-(2014/06/21(Sat) 17:39:03)
WebSurfer様 回答ありがとうございます。

メモリ解放などで検索して色々試してみたのですが、探し方が悪いのか、どうしても解放する方法を見つけることが出来ず質問させていただきました。

>>24 時間ぐらいは問題なく使えるのでしょうか、それとも 20〜30 分もすると OutOfMemoryException で落ちてしまうのでしょうか? 問題の深刻さが分かりませんが、それによって対策は変わってくると思います。
申し訳ありません。
伝え忘れていたのですが、まだ作成中のアプリで完成はしていません。
開発途中のデバッグの段階で、メモリが増大していることに気づき、耐久テストを行ったところアプリ自身のメモリが1Gを超えてしまい、そこで対応策を探していたところです。

メモリリークしたものを解放するには アプリを終了するしかないのでしょうか?

外部にフリーソフトを置いてでも解決出来ないかと考え、empty.exe ( http://yakushima-tonbo.com/windows/etc/mem_empty.html ) を設置、処理の合間に コマンドラインから実行してみたのですが、一瞬減るだけで、次の処理を行う頃には もとあった分まで消費メモリが増大していました。
引用返信 編集キー/
■72607 / inTopicNo.8)  Re[6]: vb .net メモリの解放について
□投稿者/ yama (4回)-(2014/06/21(Sat) 17:52:20)
tinq様 回答ありがとうございます。

すみません。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=11284&reno=no&oya=11284&mode=msgview&page=0 の質問も私です。
どちらの掲示板で返答をいただけるかわからず、それでも出来るだけ早く解決したかったので他所でも投稿させていただきました。
こちらで回答をいただけたので、削除したいのですが、やり方がわかりません。ご存知でしたら教えていただけないでしょうか。

jsで処理している部分を直接取得する方法ですが、よくわからないパラメーターが多く付与されていて、全く同じものを送信しても、正常なレスポンスを受け取れませんでした。

>>GeckoやWebkitのエンジンを使う
こちらに関しましては、知識がなく、想像も出来ないので色々調べてみたいと思います。
引用返信 編集キー/
■72608 / inTopicNo.9)  Re[7]: vb .net メモリの解放について
□投稿者/ yama (5回)-(2014/06/21(Sat) 17:59:52)
shu様 回答ありがとうございます。

>>常駐させるプロセスとNavigateするプロセスは分けて
アプリを二つ作る、と言うことでしょうか。
処理を分ける方法は思い付きもしませんでした。簡易的なものを作成して試してみたいと思います。

引用返信 編集キー/
■72610 / inTopicNo.10)  Re[8]: vb .net メモリの解放について
□投稿者/ なちゃ (4回)-(2014/06/22(Sun) 02:05:18)
WebBrowserコントロールを、コードで作成、破棄するつくりにすれば、多少は改善するかもしれません。
が、メモリリーク問題のところを見ると、根本解決にはならない可能性も十分ありそうです。
まあ一度試してみてもいいかもしれません。
ダメだったら、プロセス起動する形にでもしないと仕方ないでしょうね…
引用返信 編集キー/
■72614 / inTopicNo.11)  Re[6]: vb .net メモリの解放について
□投稿者/ WebSurfer (303回)-(2014/06/22(Sun) 11:15:05)
No72606 (yama さん) に返信
> 伝え忘れていたのですが、まだ作成中のアプリで完成はしていません。

それなら、アプリをある程度完成させて深刻度がどのくらいか確認してはいかが
でしょう? 24 時間ぐらい問題なく使えるなら対策は不要と言うことになるかも
しれませんし。

ところで、JavaScript で描画されるページでは、問題なく必要な情報は取得でき
るのでしょうか? Web アプリ側の作り方にもよると思いますが、例えばグーグル
あたりですと WebBrowser ではどうしようもないはずです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -