1. 程式人生 > >1024這天,我故意寫了個死迴圈~

1024這天,我故意寫了個死迴圈~

摘要: 導致CPU100%的原因很多,而程式中出現死迴圈就是原因之一。然而,並不是每個人在工作中都有機會踩中這個坑。我就是其中一個沒踩過的。人生似乎有些不完整。 所以,我做了一個很重要的決定:在程式中寫一個死迴圈。


作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要這是一個我的QQ群架構華山論劍:836442475,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 大家一起交流學習成長!

導致CPU100%的原因很多,而程式中出現死迴圈就是原因之一。然而,並不是每個人在工作中都有機會踩中這個坑。我就是其中一個沒踩過的。人生似乎有些不完整。

所以,我做了一個很重要的決定:在程式中寫一個死迴圈。看看會發生什麼事情。

當然,不是在生產環境。 我搭建了一個實驗環境來做實驗。只是這個實驗環境不僅可以用於這個死迴圈實驗。以下是這個環境的結構圖:

252cb31a541c27f9bc0a4fdc68490409251c6ac8

還是老樣子,使用Vagrant + Virtualbox + Ansible自動化搭環境。

我們會寫一個簡單的Spring MVC 應用,然後其中一個接口裡會有死迴圈程式碼:

eec0636349458ccc39808b10f983e262fbf68d7f

以下是我自己嘗試找出這個死迴圈的過程。

一、使用top,檢視是哪個程序的問題

我請求一次:

http://192.168.88.10:9898/web/loop

65b685c4f00327821015a8f95a7abdd5ab9c7161

然後,我開啟新視窗,又請求一次

d43fd03d51e1c8a5890b4450e3bbbde2217c8fc7

這裡,我好奇CPU沒有到200%。一直在120%和130%之間。P.S. 我一定是某個知識點不牢固,要不,不會有這個疑問。

二、堆空間

因為不涉及JVM堆空間問題,執行 jstat -gcutil 32593 1s 沒看出什麼問題。32593為Java程序ID,1s指1秒抽樣一次。

8c948ee099b377ffa9e98b8f749e68cd93102068

三、棧

堆沒問題,就看看是哪個執行緒佔用得高。

列出java程序的執行緒,top -H -p <java 程序pid>

f21e524c9f304ab51ed0089932bb5936d4fa1187

將jvm的棧dump下來 jstack -l <其中一個執行緒PID> >> stack.log,這裡我選3596。

在日誌中,找到相應的執行緒,我們需要從棧日誌中找到相應的執行緒,但由於棧日誌中使用的16進位制,但是top中的PID又是10進位制。所以,需要手工將10進位制的PID轉成16進位制。3596的16進位制轉是0xe0c

f027526810f1f282d1d659777cb92ad0bdc37a37

四、小結

從這個解決的方式過程中,我們已經可以看出來一種基本的處理CPU 100%的情況了!希望對大家有所幫助!

歡迎加入QQ群架構華山論劍:836442475

我們提供免費的架構資料 以及免費的解答

不懂得問題都可以來問我們老師,之後還會有職業生涯規劃,以及面試指導

我們每天晚上八點也有公開課免費學習:

10年架構師分享經驗,Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術