LifeHacker 上看到一個叫作 Minimem 的工具,主要是用來清除系統中不用的記憶體,可以設定幾秒執行一次,也可以設定針對哪一些使用記憶體量比較大的程式進行記憶體回收的動作。下載來稍微玩了一下,發現有點用處,類似的程式有 Freemem 之類的,以前一直想瞭解這些程式的運作原理,剛好 Minimem 是 .NET Framework 3.5 的程式,所以就可以拿它來 “解剖” 一下,看看實際的工作原理是甚麼。

用 Reflector 看了一下,主要是呼叫一個叫作 EmptyWorkingSet 的 Method 來進行,而它僅是一個 Interface,調用 psapi.dll 裡的 EmptyWorkingSet 這個 Method。

[DllImport(“psapi.dll”)]
private static extern int EmptyWorkingSet(IntPtr hwProc);

再 Google 一下 “EmptyWorkingSet”,發現它就是利用 Windows 提供的 API 來進行記憶體回收,僅此而已,沒有其他令人驚豔的程式碼與功能,原來這僅僅是一個系統 API 而已呀。先前以為記憶體回收是一個怎麼樣困難的技術,現在發現原來困難的技術已經被包成系統 API (“某些”系統,就是需要這些 API),很多的工具都可以利用呼叫這個 API 來達到回收效果,下回自己寫的程式吃太多記憶體的話,可以試一下寫一個會自我回收記憶體的程式。

[Reference]
http://msdn.microsoft.com/en-us/library/ms682606.aspx
http://www.google.com.hk/codesearch?q=EmptyWorkingSet&ie=UTF-8&oe=utf-8&rls=org.mozilla:zh-TW:official&client=firefox&um=1&sa=X&oi=codesearch_group&resnum=4&ct=title

至於 Minimem 嘛,仍有它的功能在,作為一個設定固定時間、針對 Process 記憶體使用量執行的介面程式,不過我還是覺得它應該要寫成 Windows 的 Service 比較好。

[Update 2008-09-24]

出差在飯店晚上無聊的時候弄了一個 Service 的版本,暫時叫作 More Memory V1.0,可以在下面的連結下載:
http://groups.google.com/group/Autorun-DIY/web/MoreMem100.zip?hl=zh-TW
安裝很簡單,就是建一個目錄,把檔案都放進去,然後跑一下 Install.bat,接著到[控制台][系統管理工具][服務] 裡頭就可以看到 FETAG – More Memory Service 把它設為 “啟動” 就可以了。要移除的話就執行 UnUnstall.bat 即可。

最後修改日期: 2008-09-24

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。