回覆列表
  • 1 # 會點程式碼的大叔

    我們在專案開發過程中和上線後,監控伺服器資源使用的時候,首先看的是就是CPU和記憶體的使用情況,所以我們在寫程式碼的時候,最好也能明白CPU使用率跟啥有關係,避免CPU不正常的飆升。

    列舉一些比較消耗CPU的操作

    GC是要佔用CPU的,所以如果程式記憶體分配太快,導致需要頻繁的進行GC操作,那麼會導致CPU的佔用率過高;例如Young GC在進行垃圾回收操作的時候,會計算記憶體和呼叫暫存器,所以如果Young GC很頻繁的話,CPU的佔用率也會很高;所以很多時候,Java程式記憶體佔用的高了,會導致CPU佔用率過高;

    順便說一句,資料庫中,大記錄集排序不僅增加了CPU開銷(資料庫伺服器);而且可能會由於記憶體不足發生硬碟排序的現象,當發生硬碟排序時效能會急劇下降;

    序列化和反序列化;

    執行緒上下文切換:如果執行緒數量啟用的過多,會導致執行緒不斷的在阻塞狀態和執行狀態之間切換;所以執行緒池的大小也不能瞎設定;

    正則表示式校驗;

    加密、解密;

    死迴圈:死迴圈會呼叫暫存器進行計數,這個操作就會佔用CPU;另外死迴圈不會讓出CPU,除非時間片到期,但是死迴圈還是會不斷地申請時間片;

    如何定位CPU佔用率過高的原因

    通常我們的應用都執行在Linux系統上:

    登入到伺服器上後,透過top命令檢視CPU使用率高的執行緒;(top後shift+H)

    找到執行緒號,轉成16進位制;

    使用jps命令檢視java程序號;

    使用jstack [程序號] 列印當前程序的堆疊;

    在堆疊資訊中,看看這個執行緒號對應的執行緒在做什麼操作。

  • 中秋節和大豐收的關聯?
  • 有什麼悽慘的純音樂推薦?