メモリーお掃除ソフトを作ろう


最終更新日 1999 12/12


はじめに

 パソコンを使っていると、いつの間にか残りメモリーが少なくなることがありませんか。Windowsはメモリーが足りなくなるとスワップをおこし、パフォーマンスが低下します。これを防ぐにはどうすればいいでしょう。実はWindowsは無駄な情報をメモリー上に保持していることがあります。こういったものを取り除くことができれば、空きメモリーの量も増えるのではないでしょうか。つまり、メモリー内のゴミを取り除くお掃除ソフトがあればいいのです。
 実際、そういったフリー・シェア・商用ソフトは存在しています。一体これらのソフトはどういった原理で動いているのでしょうか。動作原理自体はさほど難しくなく、物理メモリーを大量に確保して、開放する、といった動作をしているだけです。(中には違うことをしているものも有るかもしれませんが) 何故、それでメモリーのお掃除ができるかというと、物理メモリーを確保しろとWindowsに命令するとWindowsは確保してくれます。この時、物理メモリーが不足すると、メモリー上にある無駄な情報を解放し、また、他の動作中のアプリケーションの情報等を仮想メモリーに移動させ、物理メモリーを確保するように努めます。そして、確保したメモリーを開放すると、不要な情報はなくなりメモリーがきれい?になります。

作り方

 VBでこのようなソフトを作るにはVBの標準の関数だけでは実現できません。そこでメモリー関係のWin32API関数を使います。では、まずWin32APIの定義からいきます。

Private Declare Function VirtualAlloc Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function VirtualFree Lib "kernel32" (lpAddress As Any, ByVal dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Sub FillMemory Lib "kernel32" Alias "RtlFillMemory" (dest As Any, ByVal numBytes As Long, ByVal Fill As Byte)

 それでは、作り方を説明します。まず、メモリーの確保の方法から説明します。
メモリーを確保するにはVirtualAlloc関数を使います。使い方は、

Dim lpMem as Long
lpMem=VirtualAlloc(ByVal 0, lngByte, &H1000, &H4 Or &H200)

変数lpMemは確保したメモリーのベースアドレスが入ります。これは、後で使うので変数に保存しておかなくてはなりません。では、各引数について説明します。最初のByVal 0 は確保するメモリーの希望の開始アドレスを指定するみたいです。次のlngByteは確保したいメモリーのサイズをバイト単位で指定します。次の&H1000は確保する方法を指定します。&H1000で物理メモリーに確保します。最後の&H4 Or &H200はアクセス方法を指定してます。
 各パラメータの内容についての説明は省きます。

 確保したメモリーは開放しなくてはなりません。開放するにはVirtualFree関数を使います。

Call VirtualFree(lpMem, lngByte, &H4000)

 各引数について説明します。まず、lpMemは開放したいメモリー領域のベースアドレスを指定します。次のlngByteは開放したいメモリーのサイズ、最後の&H4000は開放する方法をしていします。

 次に確保したメモリーを初期化します。VBでは変数を宣言する(しなくても)と特に何もしなくても初期化されてますが、これはVBが特殊なだけであって、通常は初期化しなくてはいけません。で、初期化に使う関数がFillMemory関数です。

Call FillMemory(ByVal lpMem, lngByte, 0)

 最初のByVal lpMemは初期化したいメモリー領域のアドレスで、次のlngByteは初期化したいサイズ、最後の0は初期化に使う値です。初期化に使う値は指定した値でそのメモリー領域を埋めます。通常は0でいいと思います。

 最終的にメモリーお掃除ソフトはこんなふうになります。

Sub Main()
Dim lpMem as long 'アドレス保存用変数
Dim lngByte as Long '掃除するサイズ

'掃除するメモリーのサイズを設定
lngByte=Val(Command$) 'コマンドラインからサイズを決定
If lngByte=0 Then lngByte=32 '未指定で32メガバイトとする
lngByte=lngByte * 1024& * 1024& 'メガバイトをバイトに変換

'メモリーの掃除
lpMem=VirtualAlloc(ByVal 0, lngByte, &H1000, &H4 Or &H200)
Call FillMemory(ByVal lpMem, lngByte, 0)
Call VirtualFree(lpMem, lngByte, &H4000)

End Sub

 基本的な部分のみなので、使い勝手はよくありません。使い方は掃除をしたいメモリーのサイズをコマンドラインオプションにつけます。普通に起動させると32メガバイトほどお掃除します。

 

戻る