- 無限循環的while會致使CPU使用率飆升嗎?
- 常用Young GC會致使CPU佔用率飆升嗎?
- 具備大量線程的應用程序的CPU使用率是否較高?
- CPU使用率高的應用程序的線程數是多少?
- 處於BLOCKED狀態的線程會致使CPU使用率飆升嗎?
- 分時操做系統中的CPU是消耗
us
仍是sy
?
CPU%= 1 - idleTime / sysTime * 100java
人們常說,計算密集型程序的CPU密集程度更高。正則表達式
那麼,JAVA應用程序中的哪些操做更加CPU密集?數據庫
如下列出了常見的CPU密集型操做:服務器
while (true)
語句。若是在程序中計算須要很長時間,則可使線程休眠。如今,分時操做系統使用循環方式爲進程調度分配時間片。若是進程正在等待或阻塞,那麼它將不會使用CPU資源。線程稱爲輕量級進程,並共享進程資源。所以,線程調度在CPU中也是分時的。但在Java中,咱們使用JVM進行線程調度。所以,一般,線程調度有兩種模式:時間共享調度和搶佔式調度。微信
是。工具
首先,無限循環將調用CPU寄存器進行計數,此操做將佔用CPU資源。那麼,若是線程始終處於無限循環狀態,CPU是否會切換線程?oop
除非操做系統時間片到期,不然無限循環不會放棄佔用的CPU資源,而且無限循環將繼續向系統請求時間片,直到系統沒有空閒時間來執行任何其餘操做。post
stackoverflow中也提出了這個問題:爲何無心的無限循環增長了CPU的使用?spa
stackoverflow.com/questions/2…操作系統
是。
Young GC自己就是JVM用於垃圾收集的操做,它須要計算內存和調用寄存器。所以,頻繁的Young GC必須佔用CPU資源。
讓咱們來看一個現實世界的案例。for循環從數據庫中查詢數據集合,而後再次封裝新的數據集合。若是內存不足以存儲,JVM將回收再也不使用的數據。所以,若是所需的存儲空間很大,您可能會收到CPU使用率警報。
不時。
若是經過jstack檢查系統線程狀態時線程總數很大,但處於Runnable和Running狀態的線程數很少,則CPU使用率不必定很高。
我遇到過這樣一種狀況:系統線程的數量是1000+,其中超過900個線程處於BLOCKED和WAITING狀態。該線程佔用不多的CPU。
可是大多數狀況下,若是線程數很大,那麼常見的緣由是大量線程處於BLOCKED和WAITING狀態。
不是。
高CPU使用率的關鍵因素是計算密集型操做。若是一個線程中有大量計算,則CPU使用率也可能很高。這也是數據腳本任務須要在大規模集羣上運行的緣由。
不會。
CPU使用率的飆升更可能是因爲上下文切換或過多的可運行狀態線程。處於阻塞狀態的線程不必定會致使CPU使用率上升。
您可使用命令查找CPU的值us
和sy
值top
,如如下示例所示:
us
:用戶空間佔用CPU的百分比。簡單來講,高咱們是由程序引發的。經過分析線程堆棧很容易找到有問題的線程。sy
:內核空間佔用CPU的百分比。當sy爲高時,若是它是由程序引發的,那麼它基本上是因爲線程上下文切換。
如何找出CPU使用率高的緣由?下面簡要描述分析過程。
若是發現應用程序服務器的CPU使用率很高,請首先檢查線程數,JVM,系統負載等參數,而後使用這些參數來證實問題的緣由。其次,使用jstack打印堆棧信息並使用工具分析線程使用狀況(建議使用fastThread,一個在線線程分析工具)。
如下是一個真實案例:
一天晚上,我忽然收到一條消息,說CPU使用率達到了100%。而後我用jstack導出了線程棧信息。
進一步檢查日誌:
onsumer_ODC_L_nn_jmq919_1543834242875 - priority:10 - threadid:0x00007fbf7011e000 - nativeid:0x2f093 - state:RUNNABLE
stackTrace:
java.lang.Thread.State:RUNNABLE
at java.lang.Object.hashCode(Native Method)
at java.util.HashMap.hash(HashMap.java:362)
at java.util.HashMap.getEntry(HashMap.java:462)
at java.util.HashMap.containsKey(HashMap.java:449)
at com.project.order.odc.util.XmlSerializableTool.deSerializeXML(XMLSerializableTool.java:100)
at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:55)
at com.project.plugin.service.message.resolver.impl.OrderFinishMessageResolver.parseMessage(OrderFinishMessageResolver.java:21)
at com.project.plugin.service.message.resolver.impl.AbstractResolver.resolve(AbstractResolver.java:28)
at com.project.plugin.service.jmq.AbstractListener.onMessage(AbstractListener.java:44)複製代碼
如今經過這個日誌找到了問題:用於反序列化MQ消息實體的方法致使CPU使用率飆升。
BLOG地址:www.liangsonghua.com
關注微信公衆號:松花皮蛋的黑板報,獲取更多精彩!
公衆號介紹:分享在京東工做的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的