關(guān)于一個(gè)項(xiàng)目是否需要調(diào)優(yōu),大家可以先考慮不同的場(chǎng)景。12306 網(wǎng)站相信我們都不陌生,還記得 12306 剛上線的時(shí)候,隨便打開一個(gè)網(wǎng)頁(yè)需要幾十秒,好不容易擠進(jìn)去了,頁(yè)面卻顯示“系統(tǒng)繁忙,請(qǐng)稍后再試”。這樣的體驗(yàn)對(duì)于著急搶票的人來說簡(jiǎn)直讓人想撞墻,你說這樣的系統(tǒng)不進(jìn)行調(diào)優(yōu)能行嗎?再比如,機(jī)關(guān)使用的郵件系統(tǒng),一共機(jī)關(guān)才幾十個(gè)人,你說這樣的系統(tǒng)有必要進(jìn)行調(diào)優(yōu)嗎?
上面舉例的這些系統(tǒng)為了運(yùn)行穩(wěn)定,一般后臺(tái)都是由 Java 開發(fā),運(yùn)行在 Linux 環(huán)境中。下面我就說說什么時(shí)候需要進(jìn)行調(diào)優(yōu),尤其是對(duì) JVM 是否需要調(diào)優(yōu)。
體現(xiàn)系統(tǒng)性能的參考因素
首先我們需要知道系統(tǒng)當(dāng)前的運(yùn)行狀況,也就是系統(tǒng)的性能好壞,才能判斷是否需要調(diào)優(yōu)。如果系統(tǒng)的響應(yīng)時(shí)間很短,計(jì)算機(jī)的資源使用也很低,那我們做系統(tǒng)調(diào)優(yōu)就完全是為了調(diào)優(yōu)而調(diào)優(yōu)。那么衡量系統(tǒng)性能的指標(biāo)到底有哪些呢?
響應(yīng)時(shí)間:響應(yīng)時(shí)間是衡量系統(tǒng)性能的重要指標(biāo)之一,響應(yīng)時(shí)間越短,性能越好,一般一個(gè)接口的響應(yīng)時(shí)間是在毫秒級(jí)。響應(yīng)時(shí)間還包括數(shù)據(jù)庫(kù)響應(yīng)時(shí)間、服務(wù)端響應(yīng)時(shí)間、網(wǎng)絡(luò)響應(yīng)時(shí)間、客戶端響應(yīng)時(shí)間。
TPS:指系統(tǒng)接口的 TPS(每秒事務(wù)處理量),因?yàn)?TPS 體現(xiàn)了接口的性能,TPS 越大,性能越好。在系統(tǒng)中,吞吐量分為兩種:磁盤吞吐量和網(wǎng)絡(luò)吞吐量。
計(jì)算機(jī)資源分配使用率:通常由 CPU 占用率、內(nèi)存使用率、磁盤 I/O、網(wǎng)絡(luò) I/O 來表示資源使用率。這幾個(gè)參數(shù)好比一個(gè)木桶,如果其中任何一塊木板出現(xiàn)短板,任何一項(xiàng)分配不合理,對(duì)整個(gè)系統(tǒng)性能的影響都是毀滅性的。
JVM 調(diào)優(yōu)都做些什么?
具體來說 JVM 調(diào)優(yōu)需要包括兩方面:合理地設(shè)置 JVM 的內(nèi)存空間和選擇合適的垃圾回收器。
內(nèi)存空間的分配設(shè)置:JVM 內(nèi)存分配不合理帶來的性能表現(xiàn)并不會(huì)像內(nèi)存溢出問題這么突出,最直接的表現(xiàn)就是頻繁的 GC,這會(huì)導(dǎo)致上下文切換等性能問題,從而降低系統(tǒng)的吞吐量、增加系統(tǒng)的響應(yīng)時(shí)間。具體的實(shí)現(xiàn)包括調(diào)整堆內(nèi)存空間減少 Full GC、調(diào)整年輕代減少 MinorGC、設(shè)置合理的 Eden 和 Survivor 區(qū)的比例。
選擇合適的垃圾回收器:垃圾回收主要是指堆和方法區(qū)的回收,堆中的回收主要是對(duì)象的回收,方法區(qū)的回收主要是廢棄常量和無用的類的回收。垃圾收集器的種類很多,不同的場(chǎng)景有不同的選擇。對(duì)于每次操作的響應(yīng)時(shí)間要求比較高的,我們可以選擇響應(yīng)速度較快的 GC 回收器,比如 CMS 回收器和 G1 回收器;而對(duì)系統(tǒng)吞吐量有較高要求時(shí),就可以選擇 Parallel Scavenge 回收器來提高系統(tǒng)的吞吐量。
是否需要 JVM 調(diào)優(yōu)?
一般項(xiàng)目肯定是不需要進(jìn)行 JVM 調(diào)優(yōu)的,因?yàn)?JVM 本身就是為這種低延時(shí)、高并發(fā)、大吞吐的服務(wù)設(shè)計(jì)和優(yōu)化的,我們很少需要去改變什么。所以,我們往往更偏重于應(yīng)用服務(wù)本身的調(diào)優(yōu)。
在一些應(yīng)用中,比如大數(shù)據(jù)計(jì)算引擎,是一種非常極端的 JVM 應(yīng)用,對(duì)延時(shí)的要求并不高,但對(duì)吞吐量要求很高,會(huì)有大量的短生命周期對(duì)象產(chǎn)生,同時(shí)也有大量的對(duì)象生存時(shí)間非常久,我們就需要對(duì)特定的一些 JVM 參數(shù)進(jìn)行修改。
再比如生產(chǎn)環(huán)境中出現(xiàn)內(nèi)存溢出,我們需要判斷是由于大峰值下沒有限流,瞬間創(chuàng)建大量對(duì)象而導(dǎo)致的內(nèi)存溢出,還是是由于內(nèi)存泄漏而導(dǎo)致的內(nèi)存溢出。對(duì)于內(nèi)存泄漏導(dǎo)致的,這種問題就是程序的 Bug,我們需要及時(shí)找到問題代碼進(jìn)行修改,而不是調(diào)整 JVM。
JVM 在很大程度上減輕了 Java 開發(fā)人員投入到對(duì)象生命周期管理的精力。在使用對(duì)象的時(shí)候,JVM 會(huì)自動(dòng)分配內(nèi)存給對(duì)象,在不使用的時(shí)候,垃圾回收器會(huì)自動(dòng)回收對(duì)象,釋放占用的內(nèi)存。所以一般情況下我們是不需要調(diào)優(yōu)的。當(dāng)然事無絕對(duì),某些特殊場(chǎng)景就需要我們進(jìn)行參數(shù)調(diào)整,但調(diào)整的前提一定是你對(duì) JVM 的運(yùn)行原理非常熟悉才行。
為了提升大家對(duì)jvm和Java的熟練度,免費(fèi)為大家準(zhǔn)備了一套自學(xué)資料。
私信小編“資料”即可領(lǐng)取
jvm虛擬機(jī)深度講解:
系統(tǒng)和jvm調(diào)優(yōu):
全套Java視頻教程:
以上資料感興趣的,私信小編“資料”即可領(lǐng)取
好啦,今天的內(nèi)容就到這里,你認(rèn)同隨風(fēng)的觀點(diǎn)嗎?歡迎來到評(píng)論區(qū)和大家一起討論呦~
咱們下期再見!愛你??