多執行緒程式占用CPU過多的問題

2021-06-08 20:11:57 字數 1115 閱讀 5167

這幾天在做windows服務這塊,涉及到socket和多執行緒問題,功能都已經實現了的,不過在除錯的時候發現,服務不管在用不用就是無倫什麼時候,始終佔了很多cpu,25%。著實嚇了一跳。後來想一想,主要是乙個監聽子執行緒一直在後台執行,片刻也不休息一下,不管有沒有任務請求他一直都在跑。這樣不累才怪了。

所以,解決辦法也很簡單,可以說是灰常的簡單就是在迴圈監聽的時候,偶爾休息一下。

thread.sleep(10);

一句話搞定,這樣執行緒會不間斷的休息一會,忙裡偷閒一下,這時再除錯,後台cpu占有率為0,當然實在不用的情況下哈。。

.net相愛,乙個子執行緒在不做任何控制,一直執行下,基本都是佔25%的cpu,這樣隨便開幾個執行緒,你的cpu就爆了。。。

還有乙個問題,功能不是特備複雜的服務,對於記憶體的開銷比較大,測試時候最大60m多的占有量。

解決辦法,呼叫win32函式,釋放記憶體,結果是,記憶體占有量銳減,少了很多,不過而已帶了乙個問題,效能上有點影響,不過不大。。

[dllimport("kernel32.dll")]

private static extern int setprocessworkingsetsize(intptr hprocess, int dwminimumworkingsetsize, int dwmaximumworkingsetsize);

呼叫這個函式:setprocessworkingsetsize 在c++裡面

bool setprocessworkingsetsize( handlehprocess

, size_tdwminimumworkingsetsize

, size_tdwmaximumworkingsetsize

);

handlehprocess 乙個程序的控制代碼 ,下面的就是該程序的最小最大記憶體。是可以設定的。。

為了達到釋放記憶體最大化的效果,引數都是 -1,-1並不代表一點記憶體也沒有,是最小、、

如此呼叫:setprocessmemorytomin(process.getcurrentprocess().handle);

很簡單也很方便的,會讓你的程式更節省資源。。

多執行緒例項,占用CPU過多

自已研究一下,有新發現,以前沒發現這麼多 thread mainthread thread childthread private void btnrun click object sender,eventargs e protected void readthread protected void...

關於占用過多記憶體的問題

經常看見有人問,mssql占用了太多的記憶體,而且還不斷的增長 或者說已經設定了使用記憶體,可是它沒有用到那麼多,這是怎麼一回事兒呢?首先,我們來看看mssql是怎樣使用記憶體的。最大的開銷一般是用於資料快取,如果記憶體足夠,它會把用過的資料和覺得你會用到的資料統統扔到記憶體中,直到記憶體不足的時候...

如何定位占用cpu過高的執行緒

如何定位占用cpu過高的執行緒 近來發現平台應用響應越來越慢,通過top命令發現,cpu佔用率越來越高 1.首先根據top命令,發現占用cpu最高的程序pid 3075.通過ps aux grep pid命令,進一步檢視當前程序的具體資訊。2.顯示當前程序下的所有執行緒列表 找到耗時最高的執行緒ti...