一個(gè)線程占多少內(nèi)存 如何定位消耗CPU最多的線程?
如何定位消耗CPU最多的線程?在Linux系統(tǒng)下,請(qǐng)按照以下步驟進(jìn)行檢查:top-C,顯示系統(tǒng)運(yùn)行的進(jìn)程信息,輸入大寫P,進(jìn)程將根據(jù)利用率進(jìn)行排序,可以看到第一列是進(jìn)程ID,如圖所示,消耗CPU最多的
如何定位消耗CPU最多的線程?
在Linux系統(tǒng)下,請(qǐng)按照以下步驟進(jìn)行檢查:
top-C,顯示系統(tǒng)運(yùn)行的進(jìn)程信息,輸入大寫P,進(jìn)程將根據(jù)利用率進(jìn)行排序,可以看到第一列是進(jìn)程ID,如圖所示,消耗CPU最多的進(jìn)程ID是5986:
top-HP 5986,顯示進(jìn)程的線程運(yùn)行信息列表,繼續(xù)輸入大寫字母p根據(jù)CPU利用率對(duì)其進(jìn)行排序,您可以看到第一行,進(jìn)程5986中消耗CPU最多的線程ID是6021:
下一步,讓我們看看您的應(yīng)用程序做了什么。如果是Java應(yīng)用程序,要獲得更多與線程相關(guān)的信息,可以將上面的進(jìn)程ID轉(zhuǎn)換為十六進(jìn)制,因?yàn)樵诙褩V械腏av中,存儲(chǔ)線程的ID是十六進(jìn)制的。您可以直接命令“printf”%Xn“6021”,輸出:1785:
接下來(lái),您可以通過(guò)線程ID(十六進(jìn)制)查看堆棧信息。有許多工具可以查看堆棧信息。這里我使用jstack命令“jstack 5986 | grep ”0x1785 “-C5--輸出如下:
通過(guò)以上步驟,您可以知道當(dāng)前系統(tǒng)中占用CPU最多的線程以及該線程在做什么,希望能夠解決這個(gè)問(wèn)題。
多個(gè)線程可以讀一個(gè)變量,只有一個(gè)線程可以對(duì)這個(gè)變量進(jìn)行寫,到底要不要加鎖?
下面簡(jiǎn)要說(shuō)明以下原因:
鎖定是因?yàn)椴僮鞑皇窃拥?。讓我們用操作一?lái)解釋它??聪旅鎯蓚€(gè)圖。
我這個(gè)操作需要
看上面的第二個(gè)圖,你能很清楚地理解這個(gè)過(guò)程嗎?
鎖定是為了確保上述三個(gè)步驟是原子操作。
回到問(wèn)題上來(lái),只有一個(gè)線程要寫,沒(méi)有競(jìng)爭(zhēng),所以不需要鎖定。
但是,如果你看第一張圖片,因?yàn)橹鲀?nèi)存和本地內(nèi)存的存在
在一個(gè)線程寫入后,其他線程無(wú)法立即看到它。這就是可見性問(wèn)題。
添加volatile關(guān)鍵字后,它將在操作后強(qiáng)制工作內(nèi)存和主內(nèi)存同步,以確保其他線程可以立即看到它。