哪些代碼操作可能會導(dǎo)致CPU的使用率增加?
我們在項(xiàng)目開發(fā)過程中和上線后,監(jiān)控服務(wù)器資源使用的時候,首先看的是就是CPU和內(nèi)存的使用情況,所以我們在寫代碼的時候,最好也能明白CPU使用率跟啥有關(guān)系,避免CPU不正常的飆升。
列舉一些比較消耗CPU的操作GC是要占用CPU的,所以如果程序內(nèi)存分配太快,導(dǎo)致需要頻繁的進(jìn)行GC操作,那么會導(dǎo)致CPU的占用率過高;例如Young GC在進(jìn)行垃圾回收操作的時候,會計算內(nèi)存和調(diào)用寄存器,所以如果Young GC很頻繁的話,CPU的占用率也會很高;所以很多時候,Java程序內(nèi)存占用的高了,會導(dǎo)致CPU占用率過高;
順便說一句,https://www.b5b6.com/shujuku/中,大記錄集排序不僅增加了CPU開銷(https://www.b5b6.com/shujuku/服務(wù)器);而且可能會由于內(nèi)存不足發(fā)生硬盤排序的現(xiàn)象,當(dāng)發(fā)生硬盤排序時性能會急劇下降;
序列化和反序列化;
線程上下文切換:如果線程數(shù)量啟用的過多,會導(dǎo)致線程不斷的在阻塞狀態(tài)和執(zhí)行狀態(tài)之間切換;所以線程池的大小也不能瞎設(shè)置;
正則表達(dá)式校驗(yàn);
加密、解密;
死循環(huán):死循環(huán)會調(diào)用寄存器進(jìn)行計數(shù),這個操作就會占用CPU;另外死循環(huán)不會讓出CPU,除非時間片到期,但是死循環(huán)還是會不斷地申請時間片;
如何定位CPU占用率過高的原因通常我們的應(yīng)用都運(yùn)行在Linux系統(tǒng)上:
登錄到服務(wù)器上后,通過top命令查看CPU使用率高的線程;(top后shift+H)
找到線程號,轉(zhuǎn)成16進(jìn)制;
使用jps命令查看java進(jìn)程號;
使用jstack [進(jìn)程號] 打印當(dāng)前進(jìn)程的堆棧;
在堆棧信息中,看看這個線程號對應(yīng)的線程在做什么操作。
希望我的回答,能夠幫助到你!我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計、https://www.b5b6.com職業(yè)發(fā)展等方面的見解,希望能得到你的關(guān)注。