1. 程式人生 > >Delphi清理釋放本程式記憶體的程式碼

Delphi清理釋放本程式記憶體的程式碼

zt    http://www.abcxd.com/delphi/abcxddelphi/delphiZY/SetProcessWorkingSetSize.html


明生注:請注意中間那段揭密文章,來按照自己的個人意願來執行。不要貪一時的快感而影響穩定性

在WinXp,Win2K中應用此方法,不顯示主窗體一直執行的程式最佳。以前程式佔用11M記憶體,我用動態建立視窗的方法只能減少不到100K,應用此方法後記憶體佔用只有496K。把下面的過程放到一個Timer中,每隔一段時間執行一次,如30秒。 

{
************************************
* Clear Memory
* From Muse2008
************************************
}
procedure ClearMemory;
begin
        if Win32Platform = VER_PLATFORM_WIN32_NT then
        begin
                SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
                Application.ProcessMessages;
        end;
end; 

將實體記憶體的佔用挪到虛擬記憶體裡-----揭密篇
那麼我的程式為什麼能夠將佔用的記憶體移至虛擬記憶體呢?
其實,你也可以,試試看把一個程式最小化到工作列,再看看工作管理員,看到沒,你的程式佔用的實際記憶體一下子減少了,看來並不是我有什麼方法能夠壓縮記憶體,而是作業系統本身就有這個機制,即當程式不使用時(最小化),作業系統會呼叫某些命令,來將該程式佔用的記憶體移至虛擬記憶體,只保留一小部分常規程式碼
所以我們就看到了 這種情景,佔用的記憶體一下子就縮小了。
那麼:系統到底呼叫了什麼指令呢?能不能在不縮小窗體的情況下來釋放記憶體呢?
看看這個API                       SetProcessWorkingSetSize
這是從MSDN摘下的原話
Using the SetProcessWorkingSetSize function to set an application's minimum and maximum working set sizes does not guarantee that the requested memory will be reserved, or that it will remain resident at all times. When the application is idle, or a low-memory situation causes a demand for memory, the operating system can reduce the application's working set. An application can use the VirtualLock function to lock ranges of the application's virtual address space in memory; however, that can potentially degrade the performance of the system.
使用這個函式來設定應用程式最小和最大的執行空間,只會保留需要的記憶體。當應用程式被閒置或系統記憶體太低時,作業系統會自動呼叫這個機制來設定應用程式的記憶體。應用程式也可以使用  VirtualLock  來鎖住一定範圍的記憶體不被系統釋放。
When you increase the working set size of an application, you are taking away physical memory from the rest of the system. This can degrade the performance of other applications and the system as a whole. It can also lead to failures of operations that require physical memory to be present; for example, creating processes, threads, and kernel pool. Thus, you must use the SetProcessWorkingSetSize function carefully. You must always consider the performance of the whole system when you are designing an application.
當你加大執行空間給應用程式,你能夠得到的實體記憶體取決於系統,這會造成其他應用程式降低效能或系統總體降低效能,這也可能導致請求實體記憶體的操作失敗,例如:建立程序,執行緒,核心池,就必須小心的使用該函式。
========================
事實上,使用該函式並不能提高什麼效能,也不會真的節省記憶體。
因為他只是暫時的將應用程式佔用的記憶體移至虛擬記憶體,一旦,應用程式被啟用或者有操作請求時,這些記憶體又會被重新佔用。如果你強制使用該方法來設定程式佔用的記憶體,那麼可能在一定程度上反而會降低系統性能,因為系統需要頻繁的進行記憶體和硬碟間的頁面交換。

BOOL SetProcessWorkingSetSize(
  HANDLE hProcess,
  SIZE_T dwMinimumWorkingSetSize,
  SIZE_T dwMaximumWorkingSetSize
);
將 2個  SIZE_T  引數設定為 -1 ,即可以使程序使用的記憶體交換到虛擬記憶體,只保留一小部分程式碼

當然,該函式也並非無一是處,
1 。當我們的應用程式剛剛載入完成時,可以使用該操作一次,來將載入過程不需要的程式碼放到虛擬記憶體,這樣,程式載入完畢後,保持較大的可用記憶體。

2.程式執行到一定時間後或程式將要被閒置時,可以使用該命令來交換佔用的記憶體到虛擬記憶體。
最後,附上易語言 呼叫的API 程式碼
.版本 2
.DLL命令 調整記憶體, 整數型, , "SetProcessWorkingSetSize"
    .引數 控制代碼, 整數型
    .引數 最小值, 整數型
    .引數 最大值, 整數型
.版本 2
.子程式 _按鈕1_被單擊
調整記憶體 (-1, -1, -1)

偷省下事.其實第一個引數應該用 GetCurrentProc