なぜメモリ使用率が大きく異なるのでしょうか?

解決


小林  2008-04-11 18:25:02  No: 100561  IP: 192.*.*.*

自作ソフトのメモリ使用率がかなり高いので少しでも低くしようと思い、
いろいろ研究していて次のような現象を観測しました。
  Windows付属のメモ帳(notepad.exe)を起動すると、
起動直後は5500KBくらいのメモリ使用率(タスクマネージャーで見た値)なのに、
一旦最小化して元の大きさに戻すと2000KBくらいになっています。(最小化状態では700KBくらい。)
  どうしてこのように起動直後と一回最小化して元に戻したときとで、
メモリ使用率が大きく異なるのでしょうか?
  自作ソフトの場合もこのようになります。

  ということは、起動後は常に、一旦最小化して元の大きさに戻した方がいい、
というこになるのでしょうか?

  また、メモリ使用率を減らすために他にどのような対策が有効でしょうか?
  簡単に出来る対策としてどのようなものがあるでしょうか?
  よろしくお願い致します。

編集 削除
やじゅ  2008-04-11 23:50:41  No: 100562  IP: 192.*.*.*

タスク・マネージャに表示されるメモリ使用量は
「ワーキング・セット」と呼ばれ、事前に確保
されているメモリ領域に過ぎません。
http://www.atmarkit.co.jp/fdotnet/vblab/appqa_01/appqa_01_01.html

「Process Explorer」をダウンロードして見たほうがいいね。

編集 削除
夏みかん  2008-04-13 08:28:24  No: 100563  IP: 192.*.*.*

> ということは、起動後は常に、一旦最小化して元の大きさに戻した方がいい、
> というこになるのでしょうか?
好みによると思います。
私も自作ソフトのメモリ使用量を減らしたい派ですので常駐ソフトは
1.非表示ウインドウでタスクトレイに常駐
2.直ぐに最小化させる(非表示ウインドウでも最小化できる)
3.タスクトレイのアイコンよりウインドウを出す
  (このときに最小化から元に戻す)
このような感じで作っています。

> また、メモリ使用率を減らすために他にどのような対策が有効でしょうか?
> 簡単に出来る対策としてどのようなものがあるでしょうか?
> よろしくお願い致します。
ランチャーソフトなどでプログラムを起動するとメモリ量が増加する。
このためプログラムを起動して数秒後に EmptyWorkingSet 関数を呼び出すよにすると
メモリの使用量を常の抑えられる。ほっとくとタスクマネージャの仮想メモリサイズが
増大していき、EmptyWorkingSet 関数を呼んでもメモリ用が減少しなくなる。

EmptyWorkingSet 関数関連でメモリや仮想メモリについて調べてみると
なぜ最小化したり、EmptyWorkingSet 関数を呼ぶとメモリ使用量が減少するかが
分かるでしょう。

常駐プログラムなら非表示ウインドウの時に最初化することでメモリを節約できるので
この方法を使っている。メニューなどでダイアログやウインドウを出すとメモリが増大
するのでダイアログなどを閉じるときに最初化したりして不必要な空きメモリを他の
プログラムの為に使えるようにします。なお、EmptyWorkingSet は WinNT以降で使用可能。

編集 削除
小林  2008-04-16 01:54:24  No: 100564  IP: 192.*.*.*

> 「Process Explorer」をダウンロードして見たほうがいいね。
このような便利なものを紹介していただいてありがとうございます。
早速、ダウンロードして使ってみました。その結果タスクマネージャに表示される値は、
「Process Explorer」の「Working Set Size」の値であることがわかりました。
しかし、たくさんの項目があって、実際に使われているメモリの量は
どの項目を見ればいいのかよくわかりませんでした。
もしよければ教えて頂けないでしょうか?

また、ご紹介頂いたリンクには、「.NETのアプリケーションの場合・・・」と書かれており、
VB6にも当てはまることなのでしょうか?

> このためプログラムを起動して数秒後に EmptyWorkingSet 関数を
> 呼び出すよにするとメモリの使用量を常の抑えられる。
このような関数があるとは知りませんでした。さっそく試してみたいと思います。

やじゅさん、夏みかんさん、貴重なアドバイスありがとうございました。

編集 削除
やじゅ  2008-04-16 12:01:16  No: 100565  IP: 192.*.*.*

>実際に使われているメモリの量はどの項目を見ればいいのか
>よくわかりませんでした。

以外と複雑なのです、メモリって
http://d.hatena.ne.jp/NyaRuRu/20051022

編集 削除
小林  2008-04-16 23:35:29  No: 100566  IP: 192.*.*.*

> 以外と複雑なのです、メモリって
ホント複雑ですねえ(>_<)
教えて頂いたリンク先には次のように書かれていました。

「例えば 512MB の "Working Set" を持つアプリケーションのウィンドウを最小化すると,デフォルトでは "Working Set" の縮小が行われますが,ハードウェアスペックによってはこのときの縮小作業自体が軽快な UI 動作を損なうことがあります.さらにこの後アプリケーションのウィンドウサイズを復元した際にはページフォールトが多数発生しますし,ハードページフォールトが引き起こされた場合のレスポンスの悪化は非常に大きなものがあります.」

ということは、最小化すると速度が遅くなるかもしれないということですね。
EmptyWorkingSet関数で開放しても遅くなってしまうのはいやなので、やはり私の場合は使わない方がいいかもしれないです。

とにかく難しいのでこれ以上もう、メモリをケチることは考えないことにしました。(メモリを増設した方がまし・・・(>_<))

どうもありがとうございました。

編集 削除