最近聽說有一道面試題,是關於應用系統出現高CPU的原因,面試者說當時回答的不太好,他只是回答應該是應用出現了死循環,面試官繼續追問還有其它什麼原因造成高CPU的?面試者一時想不出來,所以就回復暫時想不到其它原因了。所以針對這個問題,回答的應該是挺糟糕的吧。幸好面試官繼續追問出現如何排查高CPU,面試者還能比較好的回答如何排查和解決,最後根據自身經驗講出來,總體上還算可以。那麼針對這個問題:應用高CPU的原因有哪些呢?
這個原因是最常見的,也是初學者或經驗較少的開發者會遇到比較多的原因。我們比較清楚的知道HashMap在多線程環境下出現線程不安全問題,可能會造成死循環。還有我以前在工作中也有遇到,就是使用定時任務分頁拉取數據進行處理的時候,如果在條件查詢上沒有明確定義好可能會造成一直查詢數據,一直沒有達到終止條件,就會一直循環拉取數據,一直處理,可能就造成CPU飆高,最後不得不修復bug後再重啟應用。
序列化的方式目前有很多種,包括Java原生以流的方法進行的序列化、Json序列化、FastJson序列化、Protobuff序列化等等。序列化也是一種消耗CPU比較高的方式。也有可能一些序列化方式會出現bug造成的高CPU。
在加解密時,會消耗較多的CPU進行處理計算。
正則表達式在使用的時候也要特別注意,有些情況是會出現高CPU。要注意貪婪模式和回溯問題。
如果應用是計算密集型應用,需要消耗很多CPU進行計算,這時也會出現CPU高的情況。
在流量比較大的情況,比如秒殺系統,瞬時巨大的流量衝擊我們的系統,這個時候也會造成系統的總體負載很高,也是高CPU的罪魁禍首之一。
上面所羅列的6種高CPU的情況,也算是比較常見的。如果出現之後我們就要排查原因,並且解決它。
如果你在面試的時候遇到,如果能說出3~4種,基本上算可以了,但是最好的方式要結合自身所遇到的場景,並且描述情況,然後再把自己如何解決的過程都告訴面試官,也可以看出你經驗比較豐富,這樣面試就可以事半功倍了。
你還遇過哪種造成CPU飆高的原因呢?