您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Java中使用Disruptor時需要注意哪些問題,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
首先是在服務器上用top命令查看服務器狀態,發現有一個應用程序占用的CPU時長超過100%,如圖:
我根據進程號查了一下,發現是我的一個Java游戲后臺服務,有一個CPU幾乎被占滿,因此繼續排查究竟是什么代碼導致了這種情況。
用top -Hp 27538
將這個進程的所有線程顯示出來,按照CPU占用時間排序,看到了這個結果:
27658線程占用了近乎所有的CPU時間,而且一直都是,因此查看這個進程的詳細信息。
用jstack pid > pid.log
命令將該進程的進程快照輸出到一個文件中,下載下來。
將27658轉換為16進制0x6c0a后在線程快照中查詢(因為線程快照中線程ID都是16進制存放,所以需要轉換):
"disruptor-0" #27 prio=5 os_prio=0 tid=0x00007fa100c58000 nid=0x6c0a runnable [0x00007fa0ae080000]
java.lang.Thread.State: RUNNABLE
at com.lmax.disruptor.BusySpinWaitStrategy.waitFor(BusySpinWaitStrategy.java:39)
at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56)
at com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:159)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125)
at java.lang.Thread.run(Thread.java:748)
這是Disruptor的一個堆棧,為了更直觀地查看線程的狀態信息,可以將快照上傳到專門的分析平臺上。
(博主本人對于進程快照分析也是處于新手階段,如果大家有什么建議或者意見,歡迎在下方留言。)
根據上面快照的分析,實際是Disruptor的等待策略相關的線程所導致的,查看BusySpinWaitStrategy
類,發現有相關說明:
* This strategy will use CPU resource to avoid syscalls which can introduce latency jitter. It is best
* used when threads can be bound to specific CPU cores.
現在終于知道了,原來是因為這個策略就是讓線程綁定了一個CPU核心,自然其CPU占用時間就超過100%了。
以上就是Java中使用Disruptor時需要注意哪些問題,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。