項目中用到了多線程,而且是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之間),具體沒查這個最小棧空間是多大)
在一般文章中很少見有這個參數被提起.