公司裡的一個程式,經過了N個人的手後發現上了生産記憶體會一直漲,直到實體記憶體幾乎被占用完畢後突然就下降下來(估計是GC給釋放了),然後再一直漲。這個程式主要是對字元串進行處理,困擾了我好幾天,本機測試記憶體也有增長的趨勢,但是不大明顯,上生産是2、3分鐘記憶體就上G,沒找到究竟哪裡的問題。
從網上搜了些資料,看到可以讓.NET立即釋放記憶體,本地簡單測試了一下,真的管用,但是沒敢用,不知道對于多線程的程式,當一個線程顯示釋放記憶體時會不會影響到其他線程,而且我是做金融行業程式的,程式萬一出問題就是事故,是以請教一下各位高人,這段代碼是否會影響程式的穩定性?
釋放記憶體的代碼如下:
[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
public static void GarbageCollect()
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
public static void FlushMemory()
GarbageCollect();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
Win32.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
NET裡面還有一個類可以達到這個效果
System.Diagnostics.Process.GetCurrentProcess().MinWorkingSet = new System.IntPtr(5);
采用定時釋放+窗體打開的時候,效果很好,估計程式占的記憶體會在20以下