這些年,隨著CPU、內(nèi)存、I/O 設(shè)備都在不斷迭代,不斷朝著更快的方向努力。在這個(gè)快速發(fā)展的過(guò)程中,有一個(gè)核心矛盾一直存在,就是這三者的速度差異。CPU 和內(nèi)存的速度差異可以形象地描述為:CPU 是天上一天,內(nèi)存是地上一年(假設(shè) CPU 執(zhí)行一條普通指令需要一天,那么 CPU 讀寫內(nèi)存得等待一年的時(shí)間)。內(nèi)存和 I/O 設(shè)備的速度差異就更大了,內(nèi)存是天上一天,I/O 設(shè)備是地上十年。
我們都知道的是,程序里大部分語(yǔ)句都要訪問(wèn)內(nèi)存,有些還要訪問(wèn) I/O,根據(jù)木桶理論(一只水桶能裝多少水取決于它最短的那塊木板),程序整體的性能取決于最慢的操作——讀寫 I/O 設(shè)備,也就是說(shuō)單方面提高 CPU 性能是無(wú)效的。
為了合理利用 CPU 的高性能,平衡這三者的速度差異,計(jì)算機(jī)體系結(jié)構(gòu)、操作系統(tǒng)、編譯程序都做出了貢獻(xiàn),主要體現(xiàn)為:
現(xiàn)代計(jì)算機(jī)在CPU 增加了緩存,以均衡與內(nèi)存的速度差異
操作系統(tǒng)增加了進(jìn)程、線程,以分時(shí)復(fù)用 CPU,進(jìn)而均衡 CPU 與 I/O 設(shè)備的速度差異
編譯程序優(yōu)化指令執(zhí)行次序,使得緩存能夠得到更加合理地利用
由此可見(jiàn),雖然現(xiàn)在我們幾乎所有的程序都默默地享受著這些成果,但是實(shí)際應(yīng)用程序設(shè)計(jì)和開(kāi)發(fā)過(guò)程中,還是有很多詭異問(wèn)題困擾著我們。
基本概述
每當(dāng)提起Java性能優(yōu)化,你是否有想過(guò),真正需要我們優(yōu)化的是什么?或者說(shuō),指導(dǎo)我們優(yōu)化的方向和目標(biāo)是否明確?甚至說(shuō),我們所做的一切,是否已經(jīng)達(dá)到我們的期望了呢?接下來(lái),我們來(lái)詳細(xì)探討一下。
性能優(yōu)化根據(jù)優(yōu)化的方向和目標(biāo)來(lái)說(shuō),大致可以分為業(yè)務(wù)優(yōu)化和技術(shù)優(yōu)化。業(yè)務(wù)優(yōu)化產(chǎn)生的影響是非常巨大的,一般最常見(jiàn)的就是業(yè)務(wù)需求變更和業(yè)務(wù)場(chǎng)景適配等,當(dāng)然這是產(chǎn)品和項(xiàng)目管理的工作范疇。而對(duì)于我們開(kāi)發(fā)人員來(lái)說(shuō),我們需要關(guān)注的和直接與我們相關(guān)的,主要是通過(guò)一系列的技術(shù)手段,來(lái)完成我們對(duì)既定目標(biāo)的技術(shù)優(yōu)化。其中,從技術(shù)手段方向來(lái)看,技術(shù)優(yōu)化主要可以從復(fù)用優(yōu)化,結(jié)果集合優(yōu)化,高效實(shí)現(xiàn)優(yōu)化,算法優(yōu)化,計(jì)算優(yōu)化,資源沖突優(yōu)化和JVM優(yōu)化等七個(gè)方面著手。
一般來(lái)說(shuō),技術(shù)優(yōu)化基本都集中在計(jì)算機(jī)資源和存儲(chǔ)資源的規(guī)劃上,最直接的就是對(duì)于服務(wù)器和業(yè)務(wù)應(yīng)用程序相關(guān)的資源做具體的分析,在照顧性能的前提下,同時(shí)也兼顧業(yè)務(wù)需求的要求,從而達(dá)到資源利用最優(yōu)的狀態(tài)。一味地強(qiáng)調(diào)利用空間換時(shí)間的方式,只看計(jì)算速度,不考慮復(fù)雜性和空間的問(wèn)題,確實(shí)有點(diǎn)不可取。特別是在云原生時(shí)代下和無(wú)服務(wù)時(shí)代,雖然模糊和減少了開(kāi)發(fā)對(duì)這些問(wèn)題的距離,但是我們更加需要了解和關(guān)注這些問(wèn)題的實(shí)質(zhì)。
特別指出的是,JVM優(yōu)化。由于使用Java編寫的應(yīng)用程序,本身Java是運(yùn)行在JVM虛擬機(jī)上的,這就意味著它會(huì)受到JVM的制約。對(duì)于JVM虛擬機(jī)的優(yōu)化。一定程度上會(huì)提升Java應(yīng)用程序的性能。如果參數(shù)配置不當(dāng),導(dǎo)致內(nèi)存溢出(OOM異常)等問(wèn)題,甚至引發(fā)比這更嚴(yán)重的后果。
由此可見(jiàn),正確認(rèn)識(shí)和掌握J(rèn)VM結(jié)構(gòu)相關(guān)知識(shí),對(duì)于我們何嘗不是一個(gè)進(jìn)階的技術(shù)方向。當(dāng)然,JVM虛擬機(jī)這一部分的內(nèi)容,相對(duì)編寫Java程序來(lái)說(shuō),更加比較枯燥無(wú)味,概念比較多且抽象,需要我們要有更多的耐心和細(xì)心。我們都知道,一顆不浮躁的心,做任何事都會(huì)收獲不一樣的精彩。
更多關(guān)于“java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬(wàn)人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時(shí)歡迎你來(lái)試聽(tīng)。