2011-11-28 67 views
7

我的應用程序中有內存管理問題。應用程序內存在運行時迅速增長。我在斷開模式下使用數據集。爲了解決這個問題,我經常刷新DS,並使用SetProcessWorkingSetSize來管理內存使用情況。它在我的開發計算機上工作正常。使用SetProcessWorkingSetSize有什麼優點和缺點?使用SetProcessWorkingSetSize的優缺點

+3

很難想象這樣做會阻礙其他流程的性能,而對您的流程沒有任何收益。 –

+0

這聽起來像你有一個內存泄漏,Win32 API無法爲你解決。使用類似UMDH的東西來獲取內存轉儲並追蹤泄漏。 –

回答

12

SetProcessWorkingSetSize()控制您的進程使用的RAM的數量,否則它不會影響進程的虛擬內存大小。 Windows已經非常擅長動態控制它,當另一個進程需要RAM時,可以根據需要交換內存頁面。通過手動這樣做,你的程序變慢了很多,造成大量的頁面錯誤當Windows被迫交換內存頁回。SetProcessWorkingSetSize通常用於增加的RAM分配給一個過程量。或者當應用程序知道它將長時間閒置時強制進行修剪。當您最小化應用程序的主窗口時,也可以由舊版Windows自動完成。

無需BTW PInvoke的這一點,你可以使用Process.GetCurrentProcess.Min/MaxWorkingSet性能。

3

唯一值得使用情況下,我已經看到了這個電話是當你知道你的過程是要養豬了很多系統的RAM,並要保留它的持續時間。你用它來告訴操作系統「是的,我將在整個運行過程中吃掉很多系統RAM,並且不會妨礙我的工作。」

在這種情況下,保留操作系統的默認行爲是不好的。操作系統爲每個進程(基本上是其工作空間)分配一個默認的MB MB RAM。它的資源管理啓發式算法不是神諭,所以如果他們檢測到一些進程吃的方式比系統資源的份額更多(比如RAM),他們會盡可能地回收儘可能多的餘量。對於你的過程來說,這意味着操作系統會浪費大量的CPU(並因此損害你的性能),在不需要的時候通過分配內存進出你的地址空間。

0

我們發現,對於使用Delphi for Win32/Win64編寫的GUI應用程序,或者使用在Win32 API(GDI等)之上使用大型和重型庫的類似方式編寫的GUI應用程序,值得調用SetProcessWorkingSetSize一旦。

我們與-1調用它,-1參數,第二級分內後的應用程序已經完全打開,並顯示在主窗口給用戶。在這種情況下,SetProcessWorkingSetSize(... -1,-1)會釋放大量似乎不再需要的啓動代碼。內存很快恢復到沒有SetProcessWorkingSetSize(... -1,-1)時的1/3左右,但不會增長更多。所以我們已經有效地保存了大部分啓動代碼(加載和解析配置文件,初始化GUI等)的2/3內存,這些內容可能並不需要。

如果你有一個GUI應用程序,你可以在測試自己的應用程序以同樣的方式 - 只需要調用一次,看看有多少內存已被釋放肯定。

即使沒有GUI服務器(服務)的應用程序 - 我認爲服務器後調用SetProcessWorkingSetSize一旦完全加載並初始化可能是有用的。