我們在專案開發過程中和上線後,監控伺服器資源使用的時候,首先看的是就是CPU和記憶體的使用情況,所以我們在寫程式碼的時候,最好也能明白CPU使用率跟啥有關係,避免CPU不正常的飆升。
GC是要佔用CPU的,所以如果程式記憶體分配太快,導致需要頻繁的進行GC操作,那麼會導致CPU的佔用率過高;例如Young GC在進行垃圾回收操作的時候,會計算記憶體和呼叫暫存器,所以如果Young GC很頻繁的話,CPU的佔用率也會很高;所以很多時候,Java程式記憶體佔用的高了,會導致CPU佔用率過高;
順便說一句,資料庫中,大記錄集排序不僅增加了CPU開銷(資料庫伺服器);而且可能會由於記憶體不足發生硬碟排序的現象,當發生硬碟排序時效能會急劇下降;
序列化和反序列化;
執行緒上下文切換:如果執行緒數量啟用的過多,會導致執行緒不斷的在阻塞狀態和執行狀態之間切換;所以執行緒池的大小也不能瞎設定;
正則表示式校驗;
加密、解密;
死迴圈:死迴圈會呼叫暫存器進行計數,這個操作就會佔用CPU;另外死迴圈不會讓出CPU,除非時間片到期,但是死迴圈還是會不斷地申請時間片;
通常我們的應用都執行在Linux系統上:
登入到伺服器上後,透過top命令檢視CPU使用率高的執行緒;(top後shift+H)
找到執行緒號,轉成16進位制;
使用jps命令檢視java程序號;
使用jstack [程序號] 列印當前程序的堆疊;
在堆疊資訊中,看看這個執行緒號對應的執行緒在做什麼操作。
我們在專案開發過程中和上線後,監控伺服器資源使用的時候,首先看的是就是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 [程序號] 列印當前程序的堆疊;
在堆疊資訊中,看看這個執行緒號對應的執行緒在做什麼操作。