我不停的開啟新的執行緒,執行緒方法運行的時間比開啟執行緒的時間間隔要長。
導致執行緒在不斷增加的同時,記憶體也在不斷增長,cpu跟記憶體都會爆。
后來優化了執行緒方法運行時間,以及記憶體處理。但是還是面臨cpu經常100%導致卡死,如果用執行緒池控制只開佇列最多開4個執行緒,cpu穩定運行,但是記憶體就會溢位。
這時候用什么好的方式處理?
uj5u.com熱心網友回復:
我記的執行緒池 執行任務,執行完了反饋回來可以再執行下一個,完全可以解決資源濫用的情況uj5u.com熱心網友回復:
“醫生,我頭疼”醫生說“去做檢查先”
-------------------------------------
這里一樣,我們不會像博客園那樣,一說頭疼就是血案,然后說“吃阿司匹林”,所以我們現在不會給你開藥。
你得先用vs自己得診斷工具,去實際探測,到底是什么占了記憶體。
uj5u.com熱心網友回復:
1 使用執行緒池,應該沒問題2 記憶體溢位,你檢查一下是否存在共享變數沒有回收。
uj5u.com熱心網友回復:
如果沒有共享變數。那么就可能是大物件的問題。這個需要你優化大物件。或者增加執行緒記憶體大小。
uj5u.com熱心網友回復:
機器運算能力、記憶體容量就那么大,如果偏要讓其處理超過自己能力的事情,肯定資源會不足了。執行緒池只能緩解優化調度,不能徹底解決這種問題。
也許增加CPU、增加記憶體是最直接、最暴力的解決辦法。
uj5u.com熱心網友回復:
可以使用佇列、執行緒池,限制并發的執行緒的數量uj5u.com熱心網友回復:
我不停的開啟新的執行緒-》執行緒很浪費資源,過多的執行緒會導致cpu使用率暴增。最好看一下cpu核數,參考#6的建議限制并發執行緒數量,查詢Task用法。
當然記憶體暴增也可能不只是執行緒造成的,比如非托管資源占用釋放不及時,沒有使用快取等等。
uj5u.com熱心網友回復:
記憶體溢位和執行緒的處理沒有絕對的聯系,只能說執行緒執行的任務本身對資源的回收處理是有問題的。uj5u.com熱心網友回復:
不敢茍同,執行緒本身就要占用資源,短時間啟用大量執行緒時,系統不能同時執行所有執行緒(CPU核心數有限),多余的執行緒資料會快取在系統記憶體中去排隊,等排到了再執行。如果這種執行緒積累過多,表現結果是 CPU 占用不高,但是記憶體暴漲。
uj5u.com熱心網友回復:
我在仔細說一下流程叭:我是接收相機給我的影像,一秒23幀,每個影像都要進行處理,也就相當于一幀影像開一個執行緒,執行緒方法里面是處理影像的演算法,執行緒結束之后影像也會處理釋放掉。執行緒方法處理影像時間不一樣,最快的時候3ms就處理結束,最慢500ms都有。這就導致執行緒開啟太多,cpu處理不了,然后影像處理太慢導致執行緒方法阻塞,沒有及時釋放影像,從而導致記憶體爆炸uj5u.com熱心網友回復:
拋棄執行緒,使用 Async Task,再加個回呼處理。不可能出現你說的這種情況,另外我感覺你影像處理的代碼貌似有問題,你異步的話,代碼的錯誤進行了捕捉嗎?uj5u.com熱心網友回復:
你自己給一個基本檢查,我們只能先開片藥,試試看。https://github.com/Microsoft/Microsoft.IO.RecyclableMemoryStream
ps:同上執行緒的確可記憶體沒啥關系,并不需要參考那些整天看博客園的博客論。在這里我們已經無數次證明你就是同時開1億一個只執行1ms的簡單執行緒都沒問題。
問題不在執行緒,問題在你new了無數個stream,我們都不說啥執行緒不線成。你自己看看俺們就一個單執行緒 new byte[1024*1024*1024]連續系統能讓你new幾次?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/24501.html
標籤:C#
上一篇:跪求
