性能和效率——讀《編寫高質(zhì)量代碼:改善Java程序的151個建議》(十)

讀書,收獲,分享
建議后面的五角星僅代表筆者個人需要注意的程度妓蛮。
Talk is cheap.Show me the code

建議132:提升Java性能的基本方法★☆☆☆☆

  1. 不要在循環(huán)條件中計算复濒,循環(huán)一遍就要計算一次,這會降低系統(tǒng)效率窗声。
  2. 盡可能把變量、方法聲明為final static類型
  3. 縮小變量的作用范圍辜纲,其目的是加快GC的回收笨觅。
  4. 頻繁字符串操作使用StringBuilderStringBuffer
  5. 使用非線性檢索
  6. 覆寫ExceptionfillInStackTrace方法
  7. 不建立冗余對象

建議133:若非必要,不要克隆對象★☆☆☆☆

一般情況下new生成的對象比clone生成的性能方面要好很多侨歉。

建議134:推薦使用“望聞問切”的方式診斷性能☆☆☆☆☆

性能優(yōu)化是一個漫長的工作屋摇,特別是對于偶發(fā)性的性能問題,不要期望找到“名醫(yī)”立刻就能見效幽邓,這是不現(xiàn)實的炮温,深入思考,尋根探源牵舵,最終必然能找到根源所在柒啤。

注意:性能診斷遵循“望聞問切”倦挂,不可過度急躁。

建議135:必須定義性能衡量標(biāo)準(zhǔn)★☆☆☆☆

  1. 性能衡量標(biāo)準(zhǔn)是技術(shù)與業(yè)務(wù)之間的契約

  2. 性能衡量標(biāo)志是技術(shù)優(yōu)化的目標(biāo)

性能衡量標(biāo)準(zhǔn)必須在一定的環(huán)境下担巩,比如網(wǎng)絡(luò)方援、操作系統(tǒng)、硬件設(shè)備等確定的情況下才會有意義涛癌,并且還需要限定并發(fā)數(shù)犯戏、資源數(shù)(如10萬數(shù)據(jù)和1000萬的數(shù)據(jù)響應(yīng)時間肯定不同)等。

建議136:槍打出頭鳥—解決首要系統(tǒng)性能問題★☆☆☆☆

解決性能問題時拳话,不要把所有的問題都擺在眼前先匪,這只會“擾亂”你的思維,集中精力弃衍,找到那個“出頭鳥”呀非,解決它,在大部分情況下镜盯,一批性能問題都會迎刃而解岸裙,而且我們的用戶關(guān)注最多的可能就是系統(tǒng)20%的功能,可能我們解決了這一部分速缆,已經(jīng)達(dá)到了用戶的預(yù)期目標(biāo)降允,也就標(biāo)志著我們的優(yōu)化工作可以結(jié)束了。

注意:解決性能優(yōu)化要“單線程”小步前進(jìn)艺糜,避免關(guān)注點過多而導(dǎo)致精力分散拟糕。

建議137:調(diào)整JVM參數(shù)以提升性能★☆☆☆☆

  1. 調(diào)整堆內(nèi)存大小

    在JVM中有兩種內(nèi)存:棧內(nèi)存(Stack)和堆內(nèi)存(Heap),棧內(nèi)存的特點是空間比較小倦踢,速度快,用來存放對象的引用及程序中的基本類型侠草;而堆內(nèi)存的特點是空間比較大辱挥,速度慢,一般對象都會在這里生成边涕、使用和消亡晤碘。

    堆內(nèi)存的調(diào)整不能太隨意,調(diào)整得太小功蜓,會導(dǎo)致Full GC頻繁執(zhí)行园爷,輕則導(dǎo)致系統(tǒng)性能急速下降,重則導(dǎo)致系統(tǒng)根本無法使用式撼;調(diào)整得太大童社,一則是浪費資源(當(dāng)然,若設(shè)置了最小堆內(nèi)存則可以避免此問題)著隆,二則是產(chǎn)生系統(tǒng)不穩(wěn)定的情況扰楼。

  2. 調(diào)整堆內(nèi)存中各分區(qū)的比例

    JVM的堆內(nèi)存包括三部分:新生區(qū)(Young Generation Space)呀癣、養(yǎng)老區(qū)(Tenure generation space)、永久存儲區(qū)(Permanent Space)弦赖,其中新生成的對象都在新生區(qū)项栏,它又分為伊甸區(qū)(Eden Space)、幸存0區(qū)(Survivor 0 Space)和幸存1區(qū)(Survivor 1 Space)蹬竖,當(dāng)在程序中使用了new關(guān)鍵字時沼沈,首先在伊甸區(qū)生成該對象,如果伊甸區(qū)滿了币厕,則用垃圾回收器先進(jìn)行回收列另,然后把剩余的對象移動到幸存區(qū)(0區(qū)或1區(qū)),可如果幸存區(qū)也滿了呢劈榨?垃圾回收器會再回收一次访递,然后再把剩余的對象移動到養(yǎng)老區(qū),那要是養(yǎng)老區(qū)也滿了呢同辣?此時就會觸發(fā)Full GC(這是一個非常危險的動作拷姿,JVM會停止所有的執(zhí)行,所有系統(tǒng)資源都會讓位給垃圾回收器)旱函,會對所有的對象過濾一遍响巢,檢查是否有可以回收的對象,如果還是沒有的話棒妨,就拋出OutOfMemoryError錯誤踪古,系統(tǒng)不干了!

  3. 變更GC的垃圾回收策略

    Java程序性能的最大障礙就是垃圾回收券腔,我們不知道它何時會發(fā)生伏穆,也不知道它會執(zhí)行多長時間,但是我們可以想辦法改變它對系統(tǒng)的影響纷纫,比如啟用并行垃圾回收枕扫、規(guī)定并行回收的線程數(shù)量等。

  4. 更換JVM

    目前市面上比較流行的JVM有三個產(chǎn)品:Java HotSpot VM辱魁、Oracle JRockit JVM烟瞧、IBM JVM,其中HotSpot是我們經(jīng)常使用的染簇,穩(wěn)定性参滴、可靠性都不錯;JRockit則以效率著稱锻弓,性能是它的優(yōu)勢砾赔,但在決定使用該JVM之前一定要做好全面的系統(tǒng)測試,它的某些行為可能會在JRockit上產(chǎn)生BugIBM JVM也比較穩(wěn)定过蹂,而且它在AIX系統(tǒng)上的表現(xiàn)要遠(yuǎn)遠(yuǎn)好于其他操作系統(tǒng)十绑。

建議138:性能是個大“咕咚”☆☆☆☆☆

有一部動畫片叫《咕咚來了》,其大致劇情是:三只小兔在湖邊玩耍酷勺,忽然湖中傳來“咕咚”一聲本橙,這奇怪的聲音把小兔們嚇了一大跳。小兔們剛想去看個究竟脆诉,又聽到“咕咚”一聲甚亭,這可把小兔們嚇壞了,“快跑击胜,咕咚來了亏狰,快逃呀!”小兔們轉(zhuǎn)身就跑偶摔。

狐貍正同小鳥跳舞暇唾,與跑來的兔子碰了個滿懷。狐貍一聽“咕咚來了辰斋!”也緊張起來策州,跟著就跑。它們又驚醒了睡覺的小熊和樹上的小猴宫仗,小熊和小猴也不問青紅皂白够挂,跟著它們跑起來,于是一路上跟著跑的動物越來越多藕夫,大象孽糖、河馬、老虎毅贮、野豬……

岸上這陣騷亂办悟,讓湖中的青蛙感到十分驚訝,它攔住了這群嚇蒙了的伙伴們滩褥,問出了什么事誉尖,大家七嘴八舌地形容“咕咚”是個多么可怕的怪物。青蛙問:“誰見到了铸题?”大家互相推諉,誰也沒有親眼看見琢感,于是決定回去看看明白丢间。

回到湖邊,又聽見“咕咚”一聲驹针,仔細(xì)一看烘挫,原來是木瓜掉進(jìn)水里發(fā)出的聲音,眾動物不禁大笑起來。

某些Javaer一直在質(zhì)疑Java系統(tǒng)的性能饮六,于是我們自己也跟著懷疑Java的性能—這就是發(fā)生在我們身邊的真實“咕咚”其垄,Java系統(tǒng)的性能問題本就是子虛烏有的事情,是我們自己嚇唬自己卤橄,其實绿满,我們可以從四個方面分析該問題:

  1. 沒有慢的系統(tǒng),只有不滿足業(yè)務(wù)的系統(tǒng)
  2. 沒有慢的系統(tǒng)窟扑,只有架構(gòu)不良的系統(tǒng)
  3. 沒有慢的系統(tǒng)喇颁,只有懶惰的技術(shù)人員
  4. 沒有慢的系統(tǒng),只有不愿意投入的系統(tǒng)

注意:對現(xiàn)代化的系統(tǒng)建設(shè)來說嚎货,性能就是一個大“咕咚”—看清它的本質(zhì)吧橘霎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市殖属,隨后出現(xiàn)的幾起案子姐叁,更是在濱河造成了極大的恐慌,老刑警劉巖洗显,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外潜,死亡現(xiàn)場離奇詭異,居然都是意外死亡墙懂,警方通過查閱死者的電腦和手機橡卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來损搬,“玉大人碧库,你說我怎么就攤上這事∏汕冢” “怎么了嵌灰?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颅悉。 經(jīng)常有香客問我沽瞭,道長,這世上最難降的妖魔是什么剩瓶? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任驹溃,我火速辦了婚禮,結(jié)果婚禮上延曙,老公的妹妹穿的比我還像新娘豌鹤。我一直安慰自己,他們只是感情好枝缔,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布布疙。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灵临。 梳的紋絲不亂的頭發(fā)上截型,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音儒溉,去河邊找鬼宦焦。 笑死,一個胖子當(dāng)著我的面吹牛睁搭,可吹牛的內(nèi)容都是我干的赶诊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼园骆,長吁一口氣:“原來是場噩夢啊……” “哼舔痪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锌唾,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤锄码,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晌涕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滋捶,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年余黎,在試婚紗的時候發(fā)現(xiàn)自己被綠了重窟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惧财,死狀恐怖巡扇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情垮衷,我是刑警寧澤厅翔,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站搀突,受9級特大地震影響刀闷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仰迁,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一甸昏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徐许,春花似錦施蜜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至澄步,卻和暖如春冰蘑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背村缸。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工祠肥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梯皿。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓仇箱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親东羹。 傳聞我的和親對象是個殘疾皇子剂桥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容