6-JVM常用工具和優(yōu)化

JVM 常用工具和優(yōu)化

JDK 自帶的

jconsole

jvisualvm

三方的工具

arthas

調(diào)優(yōu)關(guān)注點(內(nèi)存耻台、GC):

內(nèi)存

  • MAT
  • XElephant
  • 在線:perfma

GC

拿到GC日志,分析GC日志(吞吐量,停頓時間彭雾,垃圾回收次數(shù)揪利;這三個是評判垃圾收集器好壞的標(biāo)準(zhǔn))

  • 本地:GCViewer
  • 在線:gceasy.io

在什么情況下調(diào)優(yōu)

體現(xiàn)系統(tǒng)性能的參考因素

首先我們需要知道系統(tǒng)當(dāng)前的運行狀況,也就是系統(tǒng)的性能好壞,才能判斷是否需要調(diào)優(yōu)幸斥。如果系統(tǒng)的響應(yīng)時間很短,計算機(jī)的資源使用也很低咬扇,那我們做系統(tǒng)調(diào)優(yōu)就完全是為了調(diào)優(yōu)而調(diào)優(yōu)甲葬。那么衡量系統(tǒng)性能的指標(biāo)到底有哪些呢?

  • 響應(yīng)時間:響應(yīng)時間是衡量系統(tǒng)性能的重要指標(biāo)之一懈贺,響應(yīng)時間越短经窖,性能越好,一般一個接口的響應(yīng)時間是在毫秒級梭灿。響應(yīng)時間還包括數(shù)據(jù)庫響應(yīng)時間画侣、服務(wù)端響應(yīng)時間、網(wǎng)絡(luò)響應(yīng)時間堡妒、客戶端響應(yīng)時間配乱。
  • TPS:指系統(tǒng)接口的 TPS(每秒事務(wù)處理量),因為 TPS 體現(xiàn)了接口的性能,TPS 越大搬泥,性能越好桑寨。在系統(tǒng)中,吞吐量分為兩種:磁盤吞吐量和網(wǎng)絡(luò)吞吐量忿檩。
  • 計算機(jī)資源分配使用率:通常由 CPU 占用率尉尾、內(nèi)存使用率、磁盤 I/O燥透、網(wǎng)絡(luò) I/O 來表示資源使用率沙咏。這幾個參數(shù)好比一個木桶,如果其中任何一塊木板出現(xiàn)短板兽掰,任何一項分配不合理芭碍,對整個系統(tǒng)性能的影響都是毀滅性的。

JVM 調(diào)優(yōu)都做些什么孽尽?

具體來說 JVM 調(diào)優(yōu)需要包括兩方面:合理地設(shè)置 JVM 的內(nèi)存空間和選擇合適的垃圾回收器窖壕。

  • 內(nèi)存空間的分配設(shè)置:JVM 內(nèi)存分配不合理帶來的性能表現(xiàn)并不會像內(nèi)存溢出問題這么突出,最直接的表現(xiàn)就是頻繁的 GC杉女,這會導(dǎo)致上下文切換等性能問題瞻讽,從而降低系統(tǒng)的吞吐量、增加系統(tǒng)的響應(yīng)時間熏挎。具體的實現(xiàn)包括調(diào)整堆內(nèi)存空間減少 Full GC速勇、調(diào)整年輕代減少 MinorGC、設(shè)置合理的 Eden 和 Survivor 區(qū)的比例坎拐。
  • 選擇合適的垃圾回收器:垃圾回收主要是指堆和方法區(qū)的回收烦磁,堆中的回收主要是對象的回收,方法區(qū)的回收主要是廢棄常量和無用的類的回收哼勇。垃圾收集器的種類很多都伪,不同的場景有不同的選擇。對于每次操作的響應(yīng)時間要求比較高的积担,我們可以選擇響應(yīng)速度較快的 GC回收器陨晶,比如 CMS 回收器和 G1 回收器;而對系統(tǒng)吞吐量有較高要求時帝璧,就可以選擇 Parallel Scavenge 回收器來提高系統(tǒng)的吞吐量先誉。

是否需要 JVM 調(diào)優(yōu)?

一般項目肯定是不需要進(jìn)行 JVM 調(diào)優(yōu)的的烁,因為 JVM 本身就是為這種低延時褐耳、高并發(fā)、大吞吐的服務(wù)設(shè)計和優(yōu)化的渴庆,我們很少需要去改變什么铃芦。所以买雾,我們往往更偏重于應(yīng)用服務(wù)本身的調(diào)優(yōu)。

在一些應(yīng)用中杨帽,比如大數(shù)據(jù)計算引擎漓穿,是一種非常極端的 JVM 應(yīng)用,對延時的要求并不高注盈,但對吞吐量要求很高晃危,會有大量的短生命周期對象產(chǎn)生,同時也有大量的對象生存時間非常久老客,我們就需要對特定的一些 JVM 參數(shù)進(jìn)行修改僚饭。

再比如生產(chǎn)環(huán)境中出現(xiàn)內(nèi)存溢出,我們需要判斷是由于大峰值下沒有限流胧砰,瞬間創(chuàng)建大量對象而導(dǎo)致的內(nèi)存溢出鳍鸵,還是是由于內(nèi)存泄漏而導(dǎo)致的內(nèi)存溢出。對于內(nèi)存泄漏導(dǎo)致的尉间,這種問題就是程序的 Bug偿乖,我們需要及時找到問題代碼進(jìn)行修改,而不是調(diào)整 JVM哲嘲。

JVM 在很大程度上減輕了 Java 開發(fā)人員投入到對象生命周期管理的精力贪薪。在使用對象的時候,JVM 會自動分配內(nèi)存給對象眠副,在不使用的時候画切,垃圾回收器會自動回收對象,釋放占用的內(nèi)存囱怕。所以一般情況下我們是不需要調(diào)優(yōu)的霍弹。當(dāng)然事無絕對,某些特殊場景就需要我們進(jìn)行參數(shù)調(diào)整娃弓,但調(diào)整的前提一定是你對 JVM 的運行原理非常熟悉才行典格。

JVM錯誤排查與解決案例

JVM性能優(yōu)化到底從發(fā)現(xiàn)到解決的歷程:發(fā)現(xiàn)問題-排查問題-解決問題

案列一:

發(fā)現(xiàn)問題:JVM日志 gc.log 文件,通過JVM工具(比如:gceasy)查看并發(fā)現(xiàn)問題忘闻;比如GC的次數(shù)過多钝计;可以通過工具查看到GC次數(shù)【新生代和老年代分別的GC次數(shù)】恋博。GC頻繁:如何判斷GC頻繁呢齐佳?有個參照【比如服務(wù)剛上線GC5次,運行一段時間后10次债沮,在之后30次炼吴,在之后50次,依次類推】

排查問題:打印出JVM GC日志疫衩,查看minorGC(新生代GC)或者majorGC(老年代GC)

解決問題:適當(dāng)增加堆內(nèi)存空間硅蹦,或者選擇合適的垃圾收集器

案例二:

發(fā)現(xiàn)問題:OOM

排查問題:在JVM參數(shù)中配置,如果發(fā)生了OOM錯誤時自動dump下相關(guān)的.hprof文件,對該文件通過工具(比如MAT或者在線的perfma)進(jìn)行分析童芹;分析之后當(dāng)找到占用內(nèi)存比較大的對象對應(yīng)的線程的業(yè)務(wù)代碼(可能是程序死循環(huán)涮瞻,或者后端程序并發(fā)量比較大)

解決問題:如果是并發(fā)量比較大,就減少對后端程序的訪問假褪;通過Nginx增加機(jī)器署咽,負(fù)載均衡,權(quán)重比例

案例三

發(fā)現(xiàn)問題:CPU負(fù)載過高

排查問題:命令:top jps jinfo jstat jmap 等這些命令靈活配合使用查看生音;可能是服務(wù)程序處理壓力過大

解決問題:具體看情況而論宁否,可以集群部署、或者通過中間件(MQ缀遍、Kafka等)實現(xiàn)異步請求

案例四

發(fā)現(xiàn)問題:死鎖

排查問題:可以通過 jstack 命令去查看相關(guān)線程鎖的信息

解決問題:找到對應(yīng)的業(yè)務(wù)代碼慕匠,進(jìn)行修改;或者使用zk域醇、redis實現(xiàn)分布式鎖

案例五

發(fā)現(xiàn)問題:線程池不夠用了

排查問題:通過JDK的工具 jconcole jvisualvm 查看哪些線程得不到釋放的

解決問題:適當(dāng)?shù)膶蠖舜a優(yōu)化台谊,及時釋放資源、合理的設(shè)置線程池中的參數(shù)(大衅┲俊)

趙小胖個人博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末青伤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子殴瘦,更是在濱河造成了極大的恐慌狠角,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚪腋,死亡現(xiàn)場離奇詭異丰歌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屉凯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門立帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠砚,你說我怎么就攤上這事晓勇。” “怎么了灌旧?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵绑咱,是天一觀的道長。 經(jīng)常有香客問我枢泰,道長描融,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任衡蚂,我火速辦了婚禮窿克,結(jié)果婚禮上骏庸,老公的妹妹穿的比我還像新娘。我一直安慰自己年叮,他們只是感情好具被,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著只损,像睡著了一般硬猫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上改执,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天啸蜜,我揣著相機(jī)與錄音,去河邊找鬼辈挂。 笑死衬横,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的终蒂。 我是一名探鬼主播蜂林,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拇泣!你這毒婦竟也來了噪叙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤霉翔,失蹤者是張志新(化名)和其女友劉穎睁蕾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债朵,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡子眶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了序芦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭杰。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谚中,靈堂內(nèi)的尸體忽然破棺而出渴杆,到底是詐尸還是另有隱情,我是刑警寧澤宪塔,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布磁奖,位于F島的核電站,受9級特大地震影響蝌麸,放射性物質(zhì)發(fā)生泄漏点寥。R本人自食惡果不足惜艾疟,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一来吩、第九天 我趴在偏房一處隱蔽的房頂上張望敢辩。 院中可真熱鬧,春花似錦弟疆、人聲如沸戚长。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同廉。三九已至,卻和暖如春柑司,著一層夾襖步出監(jiān)牢的瞬間迫肖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工攒驰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蟆湖,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓玻粪,卻偏偏與公主長得像隅津,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子劲室,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • JVM 調(diào)優(yōu)是一個系統(tǒng)而又復(fù)雜的過程伦仍,但我們知道,在大多數(shù)情況下很洋,我們基本不用去調(diào)整 JVM 內(nèi)存分配充蓝,因為一些初...
    Curtain_call閱讀 1,984評論 0 1
  • 一些概念 數(shù)據(jù)類型 Java虛擬機(jī)中,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型喉磁」卓耍基本類型的變量保存原始值,即:他代...
    佘大將軍閱讀 495評論 1 0
  • 在前文《JVM原理解惑篇》中已經(jīng)梳理了主要的JVM的理論基礎(chǔ):Java程序運行在Java虛擬機(jī)之上线定,JVM管理了整...
    會飛的蝸牛F閱讀 817評論 0 0
  • 常見面試題:1)內(nèi)存泄漏與內(nèi)存溢出的區(qū)別(2)young gc會有stw嗎娜谊?(3)major gc和full gc...
    WEIJAVA閱讀 1,386評論 0 8
  • 久違的晴天,家長會斤讥。 家長大會開好到教室時纱皆,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗芭商。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22