C#中執行緒佔用記憶體過大解決方法
阿新 • • 發佈:2019-02-02
專案中用到了多執行緒,而且是1000執行緒併發執行,發現記憶體佔用過高,於是對專案裡用到的物件逐個測試,發現是執行緒物件佔用記憶體
Thread[] threads = new Thread[1000]; for(int i = 0; i<threads.Length; i++) { (threads[i] = new Thread(new ThreadStart(delegate() { Thread.Sleep(100000); })) { IsBackground = true }).Start(); };
執行以上測試程式碼,記憶體使用量瞬間增加1G, 如果數量寫到2000+, 直接丟擲System.OutOfMemoryException的異常.
---------------------
經查出thread建構函式裡有一個 int maxStackSize, //設定執行緒最大棧空間
再次測試在建構函式中把 maxStackSize設定為1024, 分配5000執行緒併發執行, 這次只佔用了1.3G左右記憶體
(事實設定1024實際棧空間並非1024,而是執行緒自動設定為最小棧空間(測試在200K至400K之間),具體沒查這個最小棧空間是多大)
在一般文章中很少見有這個引數被提起.