公司里的一個程序,經過了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();
GC.Collect();
}
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以下