溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java性能優(yōu)化筆記(一)概述

發(fā)布時(shí)間:2020-07-24 02:25:08 來(lái)源:網(wǎng)絡(luò) 閱讀:770 作者:kid2412 欄目:數(shù)據(jù)庫(kù)

性能參考指標(biāo):

  • 執(zhí)行時(shí)間: 程序從開始到結(jié)束的執(zhí)行時(shí)間。

  • CPU時(shí)間: 函數(shù)或者線程占用的cpu時(shí)間。

  • 內(nèi)存分配: 程序運(yùn)行期間所占內(nèi)存。

  • 磁盤吞吐量: 硬盤I/O使用情況。

  • 網(wǎng)絡(luò)吞吐量: 網(wǎng)絡(luò)使用情況。

  • 響應(yīng)時(shí)間:用戶行為做出的響應(yīng)時(shí)間,越短性能越好。

短板原理:

一直木桶能裝多少水取決于桶壁最短的那個(gè)木板。 
產(chǎn)生短板的資源有:

  • 磁盤I/O:很多應(yīng)用大部分瓶頸在硬盤的I/O,硬盤比內(nèi)存慢很多。如果等待磁盤讀寫完成會(huì)浪費(fèi)大量CPU時(shí)間,拖累整個(gè)系統(tǒng)。

  • 網(wǎng)絡(luò)請(qǐng)求:由于網(wǎng)絡(luò)不穩(wěn)定或擁塞控制等都會(huì)降低網(wǎng)絡(luò)請(qǐng)求效率,如果等待網(wǎng)絡(luò)請(qǐng)求結(jié)束或者超時(shí)時(shí)間設(shè)置過長(zhǎng)會(huì)浪費(fèi)大量CPU時(shí)間,拖累整個(gè)系統(tǒng)。

  • CPU:一些運(yùn)算對(duì)CPU直接或者不間斷占用很大,CPU密集型應(yīng)用會(huì)在CPU上產(chǎn)生瓶頸。

  • 程序異常:對(duì)于java應(yīng)用,異常產(chǎn)生構(gòu)造異常棧并加以處理是很耗費(fèi)資源的,高頻率出現(xiàn)異常會(huì)拖垮整個(gè)系統(tǒng)。

  • 數(shù)據(jù)庫(kù):關(guān)系型數(shù)據(jù)庫(kù)在存盤讀盤操作(即磁盤I/O操作),更新索引、鎖等待和競(jìng)爭(zhēng)都會(huì)產(chǎn)生瓶頸。

  • 鎖競(jìng)爭(zhēng):高并發(fā)應(yīng)用線程之間互相鎖的競(jìng)爭(zhēng),線程上下文切換都是很大的開銷。

  • 內(nèi)存:內(nèi)存使用nand flash讀寫速度很快,但如果應(yīng)用程序和操作系統(tǒng)把內(nèi)存占滿,會(huì)導(dǎo)致交換分區(qū)的使用,內(nèi)存數(shù)據(jù)與硬盤交換分區(qū)交換數(shù)據(jù)會(huì)產(chǎn)生(即磁盤I/O)瓶頸。

上述瓶頸基本解決方案:

  • 磁盤I/O:使用NIO、零拷貝、mmap映射等技術(shù),盡量異步讀寫硬盤,使用緩存和緩沖區(qū)技術(shù)。使用SSD硬盤,使用RAID技術(shù)提高寫入性能。

  • 網(wǎng)絡(luò)請(qǐng)求:CDN或PCDN加速、緩存、合并請(qǐng)求、壓縮報(bào)文,盡量異步網(wǎng)絡(luò)請(qǐng)求(消息隊(duì)列服務(wù)、master-worker等),使用NIO。加大帶寬、升級(jí)網(wǎng)卡。

  • CPU:持續(xù)優(yōu)化代碼,利用好多線程或多進(jìn)程,設(shè)計(jì)合理架構(gòu),拆分業(yè)務(wù),減少單機(jī)復(fù)雜運(yùn)算,避免復(fù)雜運(yùn)算和業(yè)務(wù)請(qǐng)求摻雜在一起。

  • 異常:處理好邊界、緩沖區(qū)等,尤其需要注意避免出現(xiàn)NullPointException,測(cè)試時(shí)間大于開發(fā)時(shí)間減少bug出現(xiàn)幾率。

  • 數(shù)據(jù)庫(kù):優(yōu)化sql語(yǔ)句,注意執(zhí)行計(jì)劃,使用緩存代替數(shù)據(jù)庫(kù)部分功能,根據(jù)情景使用合理的存儲(chǔ)引擎,注意鎖,使用連接池,使用PrepareStatment。

  • 鎖競(jìng)爭(zhēng):盡量減少鎖競(jìng)爭(zhēng),可以使用無(wú)鎖的copy-on-write、重入鎖等技術(shù)。

  • 內(nèi)存:優(yōu)化代碼,分析內(nèi)存占用情況,合理配置gc。增大物理內(nèi)存。

Amdahl定律:

加速比公式:加速比=優(yōu)化前耗時(shí)/優(yōu)化后耗時(shí) 
Speedup ≤ 1/(F+(1-F)/N) 
- Speedup:加速比 
- F:串行化比重 
- N:CPU數(shù)量 
根據(jù)Amdahl定律,優(yōu)化的效果取決于CPU數(shù)量以及系統(tǒng)中串行化程序比重,CPU數(shù)量越多,串行比越低,優(yōu)化效果越好。

性能調(diào)優(yōu)層次

  • 設(shè)計(jì)調(diào)優(yōu):對(duì)整體架構(gòu)進(jìn)行梳理,找出短板進(jìn)行優(yōu)化,適當(dāng)使用設(shè)計(jì)模式和以往經(jīng)驗(yàn)。詳細(xì)進(jìn)行系統(tǒng)設(shè)計(jì)。

  • 代碼調(diào)優(yōu):熟悉基本API、第三方類庫(kù)的原理,選擇最適當(dāng)和最優(yōu)秀的算法,精簡(jiǎn)實(shí)現(xiàn),面向接口。

  • JVM調(diào)優(yōu):熟悉jvm內(nèi)存模型,字節(jié)碼等深層技術(shù),使用常用監(jiān)控工具如:visualVM、Jconsole等。進(jìn)行壓測(cè),調(diào)節(jié)gc和堆棧大小。

  • 數(shù)據(jù)庫(kù)調(diào)優(yōu):對(duì)sql語(yǔ)句進(jìn)行調(diào)優(yōu),分析執(zhí)行計(jì)劃,對(duì)數(shù)據(jù)庫(kù)系統(tǒng)配置調(diào)優(yōu)(緩沖區(qū)、共享區(qū)、連接池等),對(duì)數(shù)據(jù)庫(kù)設(shè)計(jì)進(jìn)行調(diào)優(yōu)(冗余、索引、分庫(kù)分表、讀寫分離等)

  • 操作系統(tǒng)調(diào)優(yōu):調(diào)節(jié)句柄數(shù)、關(guān)閉沒用服務(wù)和端口、調(diào)節(jié)共享內(nèi)存、調(diào)節(jié)交換分區(qū)大小等。

最后需要注意:不要因?yàn)閮?yōu)化而優(yōu)化!


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI