亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java Trouble Shooting - 關(guān)于性能瓶頸

ideaa / 3440人閱讀

摘要:這個寫法常常成為系統(tǒng)的瓶頸,如果這個地方恰好是一個性能瓶頸,修改成之后,性能會有大幅的提升。

性能優(yōu)化的理念

粗略地劃分,代碼可分為 cpu consuming 和 io consuming 兩種類型,即耗 CPU 的和耗 IO 的代碼。如果當(dāng)前CPU已經(jīng)能夠接近100%的利用率, 并且代碼業(yè)務(wù)邏輯無法再簡化, 那么說明該系統(tǒng)的已經(jīng)達到了性能最大化, 如果再想提高性能, 只能增加處理器(增加更多的機器或者安裝更多的CPU)。
而耗 IO 的代碼,一般體現(xiàn)為請求某種資源,這可以是訪問數(shù)據(jù)庫,或者訪問網(wǎng)絡(luò)對端。

評價程序?qū)懙煤貌缓?,要看隨著訪問壓力的上升,CPU 使用率的變化,好的代碼,隨著訪問壓力的上升,CPU 的使用率最終能趨近100%,而壞的代碼,使用率始終無法趨近 100%,有可能在 70% 就已經(jīng)上不去了。好的代碼應(yīng)該在代碼本身效率足夠高的情況下,通過使用并發(fā)等手段,讓 CPU 的盡量地忙起來。隨著訪問壓力的上升,CPU 使用率也上升,并且 CPU 所跑的代碼都是已經(jīng)無法再進行邏輯優(yōu)化或者效率提升的代碼,這是最理想的狀態(tài)。

常見性能瓶頸 多余的同步

不相關(guān)的兩個函數(shù), 共用了一個鎖,或者不同的共享變量共用了同一個鎖, 無謂地制造出了資源爭用,如下代碼所示:

class MyClass {
  Object sharedObj;
  synchronized void fun1() {...} //訪問共享變量sharedObj
  synchronized void fun2() {...} //訪問共享變量sharedObj
  synchronized void fun3() {...} //不訪問共享變量sharedObj
  synchronized void fun4() {...} //不訪問共享變量sharedObj
  synchronized void fun5() {...} //不訪問共享變量sharedObj
}

上面的代碼將sychronized加在類的每一個方法上面, 違背了保護什么鎖什么的原則。對于無共享資源的兩個方法, 使用了同一個鎖, 人為造成了不必要的鎖等待。 上述的代碼可作如下修改:

class MyClass {
  Object sharedObj;
  synchronized void fun1() {...} //訪問共享變量sharedObj
  synchronized void fun2() {...} //訪問共享變量sharedObj
  void fun3() {...} //不訪問共享變量sharedObj
  void fun4() {...} //不訪問共享變量sharedObj
  void fun5() {...} //不訪問共享變量sharedObj
}
鎖粒度過大

對共享資源訪問完成后, 沒有將后續(xù)的代碼放在synchronized同步代碼塊之外。 這樣會導(dǎo)致當(dāng)前線程長時間無謂的占有該鎖, 其它爭用該鎖的線程只能等待, 最終導(dǎo)致性能受到極大影響。如下代碼所示:

void fun1() {
    synchronized(lock){
    ... ... //正在訪問共享資源
    ... ... //做其它耗時操作,但這些耗時操作與共享資源無關(guān)
  }
}

上面的代碼, 會導(dǎo)致一個線程過長地占有鎖, 而在這么長的時間里其它線程只能等待。應(yīng)將上述代碼作如下修改,在多 CPU 的環(huán)境中,可獲得性能的提升:

void fun1() {
  synchronized(lock) {
    ... ... //正在訪問共享資源
  }
  ... ... //其它耗時操作代碼拿到synchronized代碼外面
}
字符串連接的濫用
String c = new String("abc") + new String("efg") + new String("12345");

每一次+操作都會產(chǎn)生一個臨時對象, 并伴隨著數(shù)據(jù)拷貝, 這個對性能是一個極大的消耗。 這個寫法常常成為系統(tǒng)的瓶頸, 如果這個地方恰好是一個性能瓶頸, 修改成StringBuffer之后, 性能會有大幅的提升。

不恰當(dāng)?shù)木€程模型

在多線程場合下, 如果線程模型不恰當(dāng), 也會使性能低下,在網(wǎng)絡(luò)IO的場合, 使用消息發(fā)送隊列和消息接收隊列來進行異步IO,性能會有顯著的提升。


不恰當(dāng)?shù)?GC 參數(shù)

不恰當(dāng)?shù)腉C參數(shù)設(shè)置會導(dǎo)致嚴重的性能問題,比如堆內(nèi)存設(shè)置過小導(dǎo)致大量的 CPU 時間片被用來做垃圾回收

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69919.html

相關(guān)文章

  • Java Trouble Shooting - 使用線程棧

    摘要:線程的優(yōu)先級代表線程的優(yōu)先級為線程代表線程為,而代表該線程對應(yīng)的操作系統(tǒng)級別的線程。若是有運行圖形界面的環(huán)境,也可以使用一些圖形化的工具,例如來生成線程棧文件。使用線程棧定位問題發(fā)現(xiàn)死鎖當(dāng)兩個或多個線程正在等待被對方占有的鎖,死鎖就會發(fā)生。 什么是線程棧(thread dump) 線程棧是某個時間點,JVM所有線程的活動狀態(tài)的一個匯總;通過線程棧,可以查看某個時間點,各個線程正在做什么...

    DataPipeline 評論0 收藏0
  • walle 2.0 預(yù)覽版驚艷亮相,上線部署系統(tǒng)

    摘要:萬眾矚目的開源免費代碼部署平臺,終于出預(yù)覽版了。驚艷無比,一系列大家無比期待的逐一亮相,代碼發(fā)布終于可以不只能選擇,有了一個可自由配置項目,更人性化,支持多用戶多項目多環(huán)境同時部署的開源上線部署系統(tǒng)。 萬眾矚目的開源免費代碼部署平臺 walle 2.0,終于出預(yù)覽版了。walle 2.0 驚艷無比,一系列大家無比期待的 Feature 逐一亮相,代碼發(fā)布終于可以不只能選擇 jenkin...

    XFLY 評論0 收藏0
  • TiDB 3.0.0-rc.1 Release Notes

    摘要:用動態(tài)規(guī)劃決定連接的執(zhí)行順序,當(dāng)參與連接的表數(shù)量不多于時啟用。在邏輯優(yōu)化階段消除聚合函數(shù)時特殊處理,防止產(chǎn)生錯誤的執(zhí)行結(jié)果。該特性通過對進行執(zhí)行計劃綁定,以確保執(zhí)行穩(wěn)定性。執(zhí)行引擎支持對和算子進行內(nèi)存追蹤控制。 2019 年 5 月 10 日,TiDB 發(fā)布 3.0.0-rc.1 版,對應(yīng)的 TiDB-Ansible 版本為 3.0.0-rc.1。相比 3.0.0-beta.1 版本,...

    you_De 評論0 收藏0
  • 淺述APM采樣與端到端

    摘要:主題大綱淺述采樣與端到端何為何為端到端何為采樣的做法與弊端嘉賓介紹高馳濤,官方開發(fā)組成員,作者,云智慧高級架構(gòu)師。 極牛技術(shù)實踐分享活動 極牛技術(shù)實踐分享系列活動是極牛聯(lián)合頂級VC、技術(shù)專家,為企業(yè)、技術(shù)人提供的一種系統(tǒng)的線上技術(shù)分享活動。 每期不同的技術(shù)主題,和行業(yè)專家深度探討,專注解決技術(shù)實踐難點,推動技術(shù)創(chuàng)新,每兩周的周三20點正式開課。歡迎各個機構(gòu)、企業(yè)、行業(yè)專家、技術(shù)人...

    seasonley 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<