Windows上でシステム開発を行っていると「メモリの食いすぎ?」なんて話が出てくる。
そんな関係で調べていたらおもしろい事を発見した。
タスクマネージャでメモリ使用量をチェックすることになるが、見ていると不思議な現象が起こる。
最初にアプリケーションを起動して最初の画面が出たときのメモリ使用量は 約16M となっている。
しかし、そのアプリを最小化すると、なんと、744KB にまで極端に減った。
もう一度通常サイズに戻すと、約3M のメモリ使用量となった。
アプリを最小化するだけでメモリの開放が起こったようだ。
ほんまに?
別のテストをやってみた。
C++ で 約400M のメモリを確保するプログラムを作って動かしててみた。
赤字にしている部分が不思議。
400M 確保しているのに 64M しか増えていない。
あれれ?
もう一度動かしてみた。
今度は仮想メモリサイズも確認した。
仮想メモリのところに 400M を確保している。
なるほど、つまり、Windows200/XP はメモリ管理で実メモリと仮想メモリを一つのプロセスでも使い分けているということ。
そういえば、「メモリ使用量=ワーキングセット」とWindowsヘルプには書いてある。
つまり、その時点で使ってる実メモリ内の使用量だけが表示されている。
「仮想メモリサイズ=アドレス空間の総量」とあるから、いわゆる「本当に使ってるメモリ量」は「仮想メモリサイズ」ということだ。
タスクマネージャで、プロセス単位のメモリ使用量の合計と、仮想メモリサイズの合計を出してみたところ、「仮想メモリサイズ合計+カーネルメモリ」が、タスクマネージャのパフォーマンス・タグに出てくる「メモリ使用量」に近いことが分かった。
それにしても、GC(ガベージコレクション)を調べても、実際のメモリの開放タイミングが読み取ることが出来なかったが、意外なところで開放されるのが発見できた。
やっぱり、タスクマネージャのデフォルト表示が、プロセス単位の「メモリ使用量」だけになってるんで勘違いしがちなんだと思う。
「仮想メモリサイズ」もデフォルトに入れてほしいものだ。
そんな関係で調べていたらおもしろい事を発見した。
タスクマネージャでメモリ使用量をチェックすることになるが、見ていると不思議な現象が起こる。
最初にアプリケーションを起動して最初の画面が出たときのメモリ使用量は 約16M となっている。
しかし、そのアプリを最小化すると、なんと、744KB にまで極端に減った。
もう一度通常サイズに戻すと、約3M のメモリ使用量となった。
アプリを最小化するだけでメモリの開放が起こったようだ。
ほんまに?
別のテストをやってみた。
C++ で 約400M のメモリを確保するプログラムを作って動かしててみた。
メモリ使用量(KB) | |
---|---|
起動直後 最小化 元に戻す 400M確保 最小化 元に戻す メモリ開放 最小化 元に戻す |
2,944 16,636 748K 3,072 64,608 1,064 3,344 4,328 684 2,944 |
赤字にしている部分が不思議。
400M 確保しているのに 64M しか増えていない。
あれれ?
もう一度動かしてみた。
今度は仮想メモリサイズも確認した。
メモリ使用量(KB) | 仮想メモリKB) | |
---|---|---|
起動直後 最小化 元に戻す 400M確保 最小化 元に戻す メモリ開放 最小化 元に戻す |
2,944 16,636 748K 3,072 64,608 1,064 3,344 4,328 684 2,944 |
9,928 9,940 10,004 401,016 401,016 401,016 10,016 10,016 10,016 |
仮想メモリのところに 400M を確保している。
なるほど、つまり、Windows200/XP はメモリ管理で実メモリと仮想メモリを一つのプロセスでも使い分けているということ。
そういえば、「メモリ使用量=ワーキングセット」とWindowsヘルプには書いてある。
つまり、その時点で使ってる実メモリ内の使用量だけが表示されている。
「仮想メモリサイズ=アドレス空間の総量」とあるから、いわゆる「本当に使ってるメモリ量」は「仮想メモリサイズ」ということだ。
タスクマネージャで、プロセス単位のメモリ使用量の合計と、仮想メモリサイズの合計を出してみたところ、「仮想メモリサイズ合計+カーネルメモリ」が、タスクマネージャのパフォーマンス・タグに出てくる「メモリ使用量」に近いことが分かった。
それにしても、GC(ガベージコレクション)を調べても、実際のメモリの開放タイミングが読み取ることが出来なかったが、意外なところで開放されるのが発見できた。
やっぱり、タスクマネージャのデフォルト表示が、プロセス単位の「メモリ使用量」だけになってるんで勘違いしがちなんだと思う。
「仮想メモリサイズ」もデフォルトに入れてほしいものだ。