最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析

 更新時(shí)間:2024年01月24日 10:18:13   作者:愛(ài)上口袋的天空  
這篇文章主要介紹了Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析,在 Java 中,我們使用 JVM 進(jìn)行線程調(diào)度,所以一般來(lái)說(shuō),線程的調(diào)度有兩種模式:分時(shí)調(diào)度和搶占式調(diào)度,線程和進(jìn)程在阻塞或者等待時(shí),都不會(huì)使用 CPU 資源,需要的朋友可以參考下

一. 問(wèn)題

  • while 的無(wú)限循環(huán)是否會(huì)導(dǎo)致 CPU 使用率飆升?
  • 頻繁的 Young GC 是否會(huì)導(dǎo)致 CPU 使用率飆升?
  • 有大量線程的應(yīng)用程序的 CPU 使用率高嗎?
  • CPU 使用率高的應(yīng)用程序的線程數(shù)是否很大?
  • 處于 BLOCKED 狀態(tài)的線程是否會(huì)導(dǎo)致 CPU 使用率飆升?
  • 分時(shí)操作系統(tǒng)中的 CPU 是消耗 us(用戶態(tài)) 還是 sy(內(nèi)核態(tài))?

二. 思考

1. 我們?nèi)绾斡?jì)算 CPU 使用率?

CPU% = (1 - idleTime / sysTime ) * 100

  • idleTime:CPU 的空閑時(shí)間
  • sysTime:CPU 處于用戶態(tài)和內(nèi)核態(tài)的時(shí)間總和

2. 常見(jiàn)的 CPU 密集型操作有哪些?

人們常說(shuō),計(jì)算密集型程序就是 CPU 密集型的,那么,Java 應(yīng)用程序中有哪些操作是計(jì)算密集型的呢?

下面列出常見(jiàn) CPU 密集型操作

  • 頻繁的 GC;如果訪問(wèn)量很大,可能會(huì)導(dǎo)致頻繁的GC甚至Full GC。當(dāng)調(diào)用量大時(shí),內(nèi)存分配會(huì)非???,以至于 GC 線程會(huì)不斷執(zhí)行,導(dǎo)致 CPU 飆升。
  • 序列化和反序列化
  • 加密和解碼。
  • 正則表達(dá)式。原因可能是Java正則表達(dá)式使用的引擎實(shí)現(xiàn)是NFA自動(dòng)機(jī),它會(huì)在字符匹配時(shí)進(jìn)行回溯。
  • 線程上下文切換。有很多啟動(dòng)的線程,這些線程的狀態(tài)在 Blocked(鎖等待、IO等待等)和 Running 之間不斷變化,當(dāng)鎖爭(zhēng)用激烈時(shí),這種情況很容易發(fā)生。
  • 一些線程不斷執(zhí)行非阻塞操作,例如while (true)語(yǔ)句。如果程序中計(jì)算時(shí)間較長(zhǎng),可以休眠線程。

3. CPU 與 進(jìn)程和線程有關(guān)嗎?

現(xiàn)在,分時(shí)操作系統(tǒng)采用輪詢的方式為進(jìn)程調(diào)度分配時(shí)間片。如果進(jìn)程正在等待或阻塞,則它不會(huì)使用 CPU 資源。線程稱為輕進(jìn)程,共享進(jìn)程資源,因此線程調(diào)度在 CPU 中也是分時(shí)的。但是在 Java 中,我們使用 JVM 進(jìn)行線程調(diào)度,所以一般來(lái)說(shuō),線程的調(diào)度有兩種模式:分時(shí)調(diào)度和搶占式調(diào)度。線程和進(jìn)程在阻塞或者等待時(shí),都不會(huì)使用 CPU 資源。

三. 答案

1. while的無(wú)限循環(huán)是否導(dǎo)致CPU使用率飆升?

回答:是的

分析:首先,無(wú)限循環(huán)會(huì)調(diào)用CPU寄存器進(jìn)行計(jì)數(shù),這個(gè)操作會(huì)占用CPU資源。那么,如果線程一直處于死循環(huán)狀態(tài),CPU會(huì)不會(huì)切換線程呢?除非操作系統(tǒng)時(shí)間片到期,否則無(wú)限循環(huán)不會(huì)放棄占用的CPU資源,并且無(wú)限循環(huán)會(huì)繼續(xù)向系統(tǒng)請(qǐng)求時(shí)間片,直到系統(tǒng)沒(méi)有空閑時(shí)間做其他事情。

2. 頻繁的Young GC會(huì)導(dǎo)致CPU使用率飆升嗎?

回答:是的

分析:Young GC 本身就是 JVM 進(jìn)行垃圾回收的操作,需要計(jì)算內(nèi)存和調(diào)用寄存器,因此頻繁的 Young GC 肯定會(huì)占用 CPU 資源。

讓我們來(lái)看一個(gè)真實(shí)的案例:for 循環(huán)從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)集合,然后再次封裝新的數(shù)據(jù)集合。如果內(nèi)存不夠存儲(chǔ),JVM 會(huì)回收不再使用的數(shù)據(jù)。因此,如果需要的存儲(chǔ)空間很大,可能會(huì)收到 CPU 使用率警報(bào)。

3. 線程多的應(yīng)用CPU使用率一定高嗎?

回答:不一定

分析:如果我們通過(guò) jstack 查看系統(tǒng)線程狀態(tài)時(shí)線程總數(shù)很大,但處于 Runnable 和 Running 狀態(tài)的線程并不多,那么 CPU 使用率不一定高。但是大多數(shù)情況下,如果線程數(shù)很大,那么常見(jiàn)的原因是大量線程處于 BLOCKED 和 WAITING 狀態(tài)

4. CPU 使用率高的應(yīng)用程序的線程數(shù)一定大嗎?

回答:不一定

分析:CPU 使用率高的關(guān)鍵因素是計(jì)算密集型操作。如果一個(gè)線程有大量計(jì)算,CPU使用率也可能很高,這也是一個(gè)數(shù)據(jù)腳本任務(wù)需要在大規(guī)模集群上運(yùn)行的原因。

5. 處于BLOCKED狀態(tài)的線程是否會(huì)導(dǎo)致CPU使用率飆升?

回答:不一定

分析:CPU 使用率的飆升更多是因?yàn)樯舷挛那袚Q或過(guò)多的可運(yùn)行狀態(tài)線程。處于阻塞狀態(tài)的線程不一定會(huì)導(dǎo)致 CPU 使用率上升。

6 . CPU的us和sy值在分時(shí)操作系統(tǒng)中高是什么意思?

我們可以使用 top 命令查看 CPU 的 us 和 sy 的值,如下圖所示:

image.png

us:用戶空間占用 CPU 的百分比。簡(jiǎn)單來(lái)說(shuō),如果 us 的值比較高,則是我們程序引起的,并且分析線程堆棧很容易定位有問(wèn)題的線程sy:內(nèi)核空間占用 CPU 的百分比。sy 高的時(shí)候,如果是程序引起的,那么基本上是線程上下文切換引起的。  

四. 經(jīng)驗(yàn)

如何定位CPU使用率高的原因?下面簡(jiǎn)要介紹分析過(guò)程。

如果發(fā)現(xiàn)某個(gè)應(yīng)用服務(wù)器的CPU使用率高,首先檢查線程數(shù)、JVM、系統(tǒng)負(fù)載等參數(shù),然后用這些參數(shù)來(lái)證明問(wèn)題的原因。

其次,用 jstack 打印堆棧信息,使用工具分析線程使用情況(推薦使用在線線程分析工具fastThread)。

在線線程分析工具 fastThread 

到此這篇關(guān)于Java應(yīng)用程序的CPU使用率飆升原因詳細(xì)分析的文章就介紹到這了,更多相關(guān)Java應(yīng)用程序CPU使用率飆升內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用CountDownLatch同步j(luò)ava多線程

    如何使用CountDownLatch同步j(luò)ava多線程

    這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 通過(guò)JDK源碼學(xué)習(xí)InputStream詳解

    通過(guò)JDK源碼學(xué)習(xí)InputStream詳解

    InputStream抽象類是所有字節(jié)輸入流的類的超類。這篇文章主要給大家介紹了關(guān)于通過(guò)JDK源碼學(xué)習(xí)InputStream的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java實(shí)現(xiàn)四連環(huán)棋游戲

    Java實(shí)現(xiàn)四連環(huán)棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)四連環(huán)棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式

    SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式

    這篇文章主要介紹了SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot-mysql-HikariCP集成過(guò)程

    springboot-mysql-HikariCP集成過(guò)程

    HiKariCP opens new window是數(shù)據(jù)庫(kù)連接池的一個(gè)后起之秀,號(hào)稱性能最好,可以完美地 PK 掉其他連接池,這篇文章主要介紹了springboot-mysql-HikariCP集成過(guò)程,需要的朋友可以參考下
    2023-07-07
  • Java中的分割字符串?split(“.”)無(wú)效問(wèn)題

    Java中的分割字符串?split(“.”)無(wú)效問(wèn)題

    這篇文章主要介紹了Java中的分割字符串?split(“.”)無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java代碼mqtt接收發(fā)送消息方式

    java代碼mqtt接收發(fā)送消息方式

    這篇文章主要介紹了java代碼mqtt接收發(fā)送消息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java核心編程之文件過(guò)濾類FileFilter和FilenameFilter

    java核心編程之文件過(guò)濾類FileFilter和FilenameFilter

    這篇文章主要為大家詳細(xì)介紹了java文件過(guò)濾類FileFilter和FilenameFilter,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java替換視頻背景音樂(lè)的實(shí)現(xiàn)示例

    Java替換視頻背景音樂(lè)的實(shí)現(xiàn)示例

    FFmpeg 是一個(gè)強(qiáng)大的開(kāi)源多媒體處理工具,被廣泛應(yīng)用于音視頻的錄制、轉(zhuǎn)碼、編輯等方面,本文主要介紹了Java替換視頻背景音樂(lè),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 在SpringBoot中定義和讀取自定義配置的方法步驟

    在SpringBoot中定義和讀取自定義配置的方法步驟

    在Spring Boot中定義和讀取自定義配置是日常開(kāi)發(fā)中常見(jiàn)的需求,它允許我們以靈活的方式管理應(yīng)用的配置信息,無(wú)論是通過(guò)外部配置文件還是通過(guò)環(huán)境變量,本文是一個(gè)詳細(xì)的步驟說(shuō)明,包括示例代碼,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

兖州市| 农安县| 天门市| 盐边县| 湘阴县| 包头市| 嘉兴市| 得荣县| 二连浩特市| 乐清市| 天津市| 滨州市| 仁怀市| 杭州市| 临城县| 涪陵区| 嘉义市| 邯郸县| 北宁市| 新绛县| 合水县| 永福县| 乡宁县| 曲靖市| 天水市| 留坝县| 濉溪县| 永善县| 二连浩特市| 禄劝| 南郑县| 扶绥县| 定西市| 伊金霍洛旗| 沁水县| 东乡县| 松桃| 江油市| 陇西县| 襄垣县| 景宁|