メモリは、何らかのプログラムが使用した後、破棄されるときに解放されるはずなんですが、完全に解放されないようです。
このメモリの容量が無くなってくると、いろいろと動作が遅くなってしまうという現象が起きます。これを防ぐためにメモリクリーナーは存在するのです。
メモリクリーナーはHSPでも簡単に作る事が出来ます。スワッピングとかスワップ法とか呼ばれている方法で、空きメモリ領域を越えるくらいにメモリを取得し、
その領域範囲を縮小する…という感じです。具体的には、
alloc mem,10*1024*1024 ;10MB確保
alloc mem,64 ;領域縮小
;sdimでも可
|
というだけでもクリーン出来ています。
しかし、これだけでは全体的にどれくらいの領域を確保したかわかりません。ので、メモリを監視しながらやってみればいいのです。
メモリの情報を得るにはsysinfo命令を使います。Ver2.6未満のバージョンではhspext.dllの命令でしたが、Ver2.6より通常命令になっています。
この命令で取得するのは物理メモリです。sysinfo命令は、物理メモリ全体サイズ、空き物理メモリサイズ、メモリ使用率を全て取得できるので、
メモリクリーナーを作るには十分な機能が備わっています。
とりあえずソースです。
;メモリクリーナー
screen 0,180,120
title "メモリクリーナー"
sysfont 17 ;GUIフォント使用
objmode 1,1 ;オブジェクトでGUIフォント使用&TAB移動許可
objsize 80,20
pos 50,90 : button "クリーン",*clean
objsize 50,20
pos 110,65 : combox index,150,"10%\n20%\n30%\n40%\n50%\n60%\n70%\n80%\n90%"
*mainloop ;メインループ
redraw 0
color 192,192,192 : boxf ;灰色に塗りつぶす
sysinfo per,33 ;物理メモリ使用率取得(%)
sysinfo all,34 ;物理メモリの全体サイズを取得
sysinfo vac,35 ;空き物理メモリサイズの取得
all_i=all/1024/1024 ;MBに変換(整数部)
all_d=all/1024\1024 ;小数部
vac_i=vac/1024/1024 ;MBに変換(整数部)
vac_d=all/1024\1024 ;小数部
color : pos 10,10 : mes "全体物理メモリサイズ "+all_i+"."+all_d+"MB"
pos 10,30 : mes "空き物理メモリサイズ "+vac_i+"."+vac_d+"MB"
pos 10,50 : mes "物理メモリ使用率 "+per+"%"
pos 10,70 : mes "クリーンサイズ(MB):"
redraw 1
wait 10
goto *mainloop
*clean ;クリーナー部
title "クリーン中"
alloc mem,all/100*(index+1*10) ;メモリ確保
alloc mem,64 ;領域縮小
title "クリーン終了"
goto *mainloop
|
一応メモリを監視しながらクリーンするプログラムが出来あがりました。
パーセントを指定して「クリーン」ボタンを押すとちゃんと空き容量が増えますよね。
ただ60%以上のクリーンをしても空き容量はおそらく全体の半分ほどにしかならないでしょう。
この方法は、空き容量を越えた分を確保します。その超えた部分は、スワップ領域と呼ばれるハードディスク上のある場所に置かれる事になるのですが
あまり確保しすぎると、このスワップ領域の負担が重くなり、かえって遅くなってしまう事になります。
ですから、大体確保するパーセントは50%ぐらいで十分だという事です。
実のところ私はメモリの何たるかをあまり理解していないので(ある程度使い方はわかる)、この内容が本当に正しいのかもあまり自信はありません。
特に用語とか、多分意味ををはきちがえていたりするかもしれないのでご了承ください。
ちなみにうちの環境では常にメモリ使用率は100%!!クリーンしても100%!!
意味無いなあと思う。
クリーナーが機能していないというわけではありません。他ソフトで掃除しても同じでした。