<追記>
Leopardでは効果が不明です。効いているような効いていないような・・・
人柱になって下さる方大募集。
</追記>
先日残り空きメモリ監視AppleScript「Freemem Monitor」作成 (うむらうす) というエントリーを書いた。
空きメモリを周期的に監視し、空きが設定値以下になったらプロンプトを出して、 不使用のメモリを解放するスクリプトを走らせるというものだ。 これにより空きメモリ不足でスワップファイルが増殖して、 OSXの動作がもっさりするのを未然に防ぐのが狙いだ。
すると「なんで自動的にメモリ解放スクリプトを走らせないの?」 という至極もっともな指摘をいただいたた。 そこで、空きメモリ監視スクリプト「Freemem Monitor」と不使用メモリ解放スクリプト「Release Memory」を一体化したスクリプトを作成した。 とりあえず名前は「Freemem Keeper」とする。
ダウンロード:Freemem_Keeper.zip
ダウンロード:Freemem_Keeper(Growl)1.1.zip
(旧バージョン:Freemem_Keeper(Growl).zip)
解凍すると「Freemem_Keeper」というフォルダが作成され、
中に「Freemem Keeper.app」と「Release Memory2.app」が入っているはず。
(Growl)は、メモリ解放スクリプトの起動時、終了時の通知をGrowlで行うVersionで、
機能は全く同じ。
AppleScriptとGrowlの連携についてはこちらを参考にした。
→AppleScript Support for Growl
<追記>
1.1は初期画面がジャマというリクエストがあったので、出ないバージョン。
ついでにメモリ値設定のエラーチェックなど文法的な指摘も取り入れ。
いじったものの、実はもはやTigerで動作確認ができない。何かおかしかったらコメント欄までお願いします。
</追記>
使い方はFreemem Keeper.appを好きな場所に置いて(「ホーム/ライブラリ/Scripts」推奨)、 ダブルクリックで起動する。 すると下↓のような画面が現れる。1.1から起動画面表示しません。

↑起動時の画面。読まないで飛ばしていい。
実行を押すと起動する。終了を押した時のことを考えていないのはヒミツだ。
次に下のような画面が現れるので、空きメモリの下限値を設定する。

1MBでも10000000MBでも対応可能だが、0やマイナスの数値を入力された時のことを考えていないのはヒミツだ。1.1の方で対応しました。
キャンセルを押してもちゃんと終了できるようにしました(←してなかったの?)。
あとは放っておけば勝手に1分に一度空きメモリをチェックし、 設定値以下になっていたら下の画面を表示し、OKを押すとメモリ解放スクリプトが走る。

紳士的に動作を予告する機能付き。拒否権は与えられない。
ちなみにGrowlだとこんな。
![]()
こちらも拒否権は与えられない。
メモリ解放の努力が終了すると、下の画面が表示され、作業の完了を告げる。

紳士的に作業の完了を告げる機能付き。拒否権は与えられない。
![]()
Growlだとこんな。
以上がこのスクリプトの全貌だ。
隠し機能とかは特にないので探さない方が吉。
ということで、今回からは「Freemem Keeper」でメモリ解放の役割も果たすため、 「Release Memory2」はオマケ(変更もなし)。 手動でメモリ解放をさせたい人はこちらを使って下さいということで。
<追記>
基本的に動作させっぱなしでよいのだが、終了させておいた方がいいケースが存在するようだ。
以下、mutaさんの紹介記事からの引用。
プロセスが全て自動化されているので、ユーザは起動させたらあとは放ったらかしでいい。 注意点はCDなどの焼き焼き中やディスクのバックアップを取っている時にはこれを終了させることを忘れないことだ。 そういう作業中にこれが作動されると、CDはお釈迦、バックアップも最初からやり直しになる。
またSafariなどドックにしまった状態で、これが作動するとそれ以降Safariが操作不能になる不具合が起きる。 これはこのスクリプトのせいというよりは、Safari3とシステムの相性の問題だと思われる。 Freemem Keeperとは関係無しに、「隠す」動作の後ウインドウそのものが操作不能になる不具合が頻発するからだ。
ということなので、必要に応じて終了させてやって欲しい。 (ちなみにわたしはバックアップにDeja Vuを使っているが、 バックアップ中に発動しても特に問題なかった。) 他にも不具合が起きるケースはあると予想されるので、 見つけた方はコメント等で連絡いただけるとありがたい。
対応策としては、mutaさんも書かれているようにFreemem Monitorを使えば勝手に発動はしない。
使い分けて欲しい。
</追記>
以下、ソースを書く。興味がある人はどうぞ。
set temp_delim to AppleScript's text item delimiters --set the minimum limit number of Free memory(MB) --propertyでなくても、ハンドラ内でglobal宣言すればOK repeat set errorFlag to false try set alarm_size to text returned of (display dialog "Input the limit memory size(MB)." default answer "200") on error set cancelFlag to true exit repeat end try --in case the number is less of than or equal to 0 try if alarm_size is less than or equal to 0 then error on error set errorFlag to true set alarm_size to 0 end try if not errorFlag then exit repeat end repeat --error処理 try if cancelFlag then display dialog ("キャンセルされました") buttons {"終了"} set cancelFlag to "" quit end if on error end try --リミット値をページ単位に換算 (1024^2)/4096=256 try set alarm_pages to alarm_size * 256 on error display dialog ("can not set alarm_pages") end try --監視間隔(秒)の設定 property waiting_interval : "60" tell application "GrowlHelperApp" -- Make a list of all the notification types -- that this script will ever send: set the allNotificationsList to ? {"Start Running", "Finish Running"} -- Make a list of the notifications -- that will be enabled by default. -- Those not enabled by default can be enabled later -- in the 'Applications' tab of the growl prefpane. set the enabledNotificationsList to ? {"Start Running", "Finish Running"} -- Register our script with growl. -- You can optionally (as here) set a default icon -- for this script's notifications. register as application ? "Freemem Keeper" all notifications allNotificationsList ? default notifications enabledNotificationsList ? icon of application "Script Editor" end tell on idle --Mach Virtual Memory Statistics(vm_stat)から空きメモリページ数を取得 global alarm_pages, alarm_size, temp_delim set AppleScript's text item delimiters to return set vm_stats to do shell script "vm_stat | grep Page" set free_mem to text item 1 of vm_stats set AppleScript's text item delimiters to " " set free_size to (last text item of free_mem) as number -- Main part of the script. -- When Free memory is less than set number, -- run Release Memory script to prevent memory shortage. if free_size is less than alarm_pages then -- Run Release Memory --display dialog "Release Memory 起動!" buttons {"OK"} tell application "GrowlHelperApp" -- Send a Notification... notify with name ? "Start Running" title ? "Start Running" description ? "Release Memory started." application name "Freemem Keeper" end tell -- Restart Finder tell application "Finder" quit delay 1 try tell application "Finder" to activate on error delay 1 tell application "Finder" to activate end try if exists Finder window 1 then activate set windowBounds to (bounds of Finder window 1) set theFolder to target of Finder window 1 close Finder window 1 open theFolder set bounds of Finder window 1 to windowBounds end if end tell --on activateFinder() -- try -- tell application "Finder" to activate -- on error -- activateFinder() of me -- end try -- end of activateFinder() -- end of restart Finder -- restart Dock do shell script "killall Dock" --delete Dashboard cache do shell script "rm -rf ~/Library/Caches/DashboardClient/*" -- Run Repair Permissions via an AppleScript - macosxhints.com -- http://www.macosxhints.com/article.php?story=20030120061404240 -- MXanadu62さんの指摘により管理者権限省略 do shell script "diskutil repairPermissions /" --End of Release Memory --display dialog "Release Memory 完了!" buttons {"OK"} tell application "GrowlHelperApp" notify with name ? "Finish Running" title ? "Finish Running" description ? "Release Memory finished." application name "Freemem Keeper" end tell end if set AppleScript's text item delimiters to temp_delim return waiting_interval end idle
まとめ
- 空きメモリを監視し、設定値以下になったらメモリ解放を試みるAppleScript「Freemem Keeper」を作成
- これ一つ走らせておけば、残りメモリに目を光らせていなくてよくなるので結構便利
- といっても特定のアプリのメモリが肥大化してしまうと、あまりメモリを解放できなくなるので、そういうときはそのアプリを一度終了する
まだ完成していない部分もあると思うので、フィードバックをお願いしたい。 あと、やっていることはシステムメンテなので特に害はないと思うが、 まぁご利用は自己責任ということで・・・
ということで皆さまご機嫌よう。
追記)
各所で紹介して頂いた。ありがとうございます。m(_*_)m
自分では補足しきれていないところもあるので、参考にされたい。
- Macの手書き説明書 | Freemem Kepper>
- soundscape out - Freemem Keeper
- muta's mac scribbling - OS運用記録9月4
発動させない方がいい状況を紹介してくださっている。 - D.I.'s Memorandum | 空きメモリ確保AppleScriptについて
FinderとDockの再起動を外すHackをされている。すみません全てには手が回りません・・・。 - glad design blog | 空きメモリ確保AppleScript「Freemem Keeper」








コメント (10)
つまり、起動しっぱなしということでよいのでしょうか。
投稿者: じゅん | 2007年9月24日 16:17
日時: 2007年9月24日 16:17
はい。何もしていないときは、CPU占有率0%であることを確認しています。
投稿者: ハル | 2007年9月24日 16:33
日時: 2007年9月24日 16:33
終了時にDashboardを一瞬だけ起動するようにするにはどうすれば良いのでしょうか?
投稿者: ざんしゅ | 2007年9月25日 19:36
日時: 2007年9月25日 19:36
ざんしゅさん
Dashboardのcacheを削除するため、次の起動に時間がかかることを回避したいというリクエストと理解しました。
とすると、解決法は以下の2つです。お好きな方をどうぞ。
どちらも、Freemem Keeperを「アプリケーション>AppleScript>スクリプトエディタ」で開いて編集して下さい。
1.cacheの削除をしないようにする
do shell script "rm -rf ~/Library/Caches/DashboardClient/*"
という行の先頭に、下のように「--」を追加してコメントアウトする。
--do shell script "rm -rf ~/Library/Caches/DashboardClient/*"
2.メモリ解放プロセスの最後にDashboardの起動を入れる
--End of Release Memory の行の上に、
以下のコードをコピペして下さい。
tell application "System Events"
key code 111
end tell
delay 2
tell application "System Events"
key code 111
end tell
delayの数字が待ち時間なので、適当に変更して下さい。
投稿者: ハル | 2007年9月26日 00:01
日時: 2007年9月26日 00:01
ハルさま。ご無沙汰です。
Leopardが走るんですね。うらやましい…。f(^^;
Freemem Keeperについて細かいことですが、ちょっと気になったことを…。
1.起動後に終了させるのは強制終了させるのでしょうか?
もしその場合はon idleハンドラ内に「set AppleScript's text item delimiters to temp_delim」を持ってきた方が、作法としては正しいように思います。
強制終了してもスクリプトエディタで調べると、デリミタが初期値である「{""}」から変わったままにはならないようですが…。
ちなみにFreemem Keeper内で表示させるとデリミタは変更されています。on idleハンドラ内に以下を埋め込むと確認できます。
display dialog ascii number of (AppleScript's text item delimiters as text)
2.起動時に初期画面を表示させているのは意図があってのことですか?(余計なお世話!)
これは保存時にチェックボックスを外せば出ないようになりますが…。
投稿者: MXanadu62 | 2007年11月 3日 00:22
日時: 2007年11月 3日 00:22
MXanadu62さん
ご指摘どうもです。とりあえず反映させてみました。
現状もっぱらの関心は、Leopardで効き目がないことです。LeopardではSwapfileが6個できてても、あまり動作が遅くならないんですよね。
その辺なにか改良されたんでしょうかね。
投稿者: ハル | 2007年11月 3日 00:55
日時: 2007年11月 3日 00:55
> 現状もっぱらの関心は、Leopardで効き目がないことです。
Loepardのアクセス権修復にはバグがあるようですね。
日本のディスカッションルームは嫌い(笑)なので見てませんが、本家のディスカッションルームに以下のスレッドが立っています。
http://discussions.apple.com/thread.jspa?messageID=5662841
いろいろごちゃごちゃ書いてありますが、以下のMacFixItの記事に代表されるようです。
http://www.macfixit.com/article.php?story=20071031102625632
コマンドラインでもディスクユーティリティでもアクセス権を修復できないようですね。
本来の働きができないから、メモリ解放もできないのではないでしょうか?
> LeopardではSwapfileが6個できてても、あまり動作が遅くならないんですよね。
> その辺なにか改良されたんでしょうかね。
Leopardが走るMacでないので分かりません。(笑)
でも、基本的にUnixから引き継いだ仕組みだから、大変更がされているとは考えにくいと思うんですが…。
投稿者: MXanadu62 | 2007年11月 4日 11:15
日時: 2007年11月 4日 11:15
MXanadu62さん
情報ありがとうございます。
細かいエラーメッセージはさておき、私が感じていることは他でも確認されているとわかりました。とりあえずupdate待ちですかね。
>でも、基本的にUnixから引き継いだ仕組みだから、大変更がされているとは考えにくいと思うんですが…。
とりあえずswapfileが4つ以上作られたときの虹色カーソルぐるぐる状態は大分良くなっている印象です。OS内部の細かい仕組みが変わっているものと思います。
投稿者: ハル | 2007年11月 4日 12:49
日時: 2007年11月 4日 12:49
10.5にいれてみました〜〜 勝手にスリープとか再起動しますか?などのダイアログがでるみたいです〜〜〜
投稿者: adocha | 2008年4月20日 23:07
日時: 2008年4月20日 23:07
adochaさん、どうもです。
人柱ありがとうございますm(_*_)m
私も今Leopard上で起動し、様子を見ているのですが、特にそういったメッセージは出てこないみたいです。
何かのアプリケーションと相性が悪いのかもしれませんね。
もし何かわかりましたら、教えていただけると助かりますです。
投稿者: haru | 2008年4月22日 00:31
日時: 2008年4月22日 00:31