性能優(yōu)化一向是后端服務(wù)優(yōu)化的重點(diǎn),但是線上性能故障問題不是經(jīng)常出現(xiàn),或者受限于業(yè)務(wù)產(chǎn)品,根本就沒辦法出現(xiàn)性能問題,包括筆者自己遇到的性能問題也不多,所以為了提前儲備知識,當(dāng)出現(xiàn)問題的時候不會手忙腳亂,我們本篇文章來模擬下常見的幾個Java性能故障,來學(xué)習(xí)怎么去分析和定位。
既然是定位問題,肯定是需要借助工具,我們先了解下需要哪些工具可以幫忙定位問題。
top命令
top命令是我們最常用的Linux命令之一,它可以實(shí)時的顯示當(dāng)前正在執(zhí)行的進(jìn)程的CPU使用率,內(nèi)存使用率等系統(tǒng)信息。top -Hp pid 可以查看線程的系統(tǒng)資源使用情況。
vmstat命令
vmstat是一個指定周期和采集次數(shù)的虛擬內(nèi)存檢測工具,可以統(tǒng)計(jì)內(nèi)存,CPU,swap的使用情況,它還有一個重要的常用功能,用來觀察進(jìn)程的上下文切換。字段說明如下:
r: 運(yùn)行隊(duì)列中進(jìn)程數(shù)量(當(dāng)數(shù)量大于CPU核數(shù)表示有阻塞的線程)
b: 等待IO的進(jìn)程數(shù)量
swpd: 使用虛擬內(nèi)存大小
free: 空閑物理內(nèi)存大小
buff: 用作緩沖的內(nèi)存大小(內(nèi)存和硬盤的緩沖區(qū))
cache: 用作緩存的內(nèi)存大小(CPU和內(nèi)存之間的緩沖區(qū))
si: 每秒從交換區(qū)寫到內(nèi)存的大小,由磁盤調(diào)入內(nèi)存
so: 每秒寫入交換區(qū)的內(nèi)存大小,由內(nèi)存調(diào)入磁盤
bi: 每秒讀取的塊數(shù)
bo: 每秒寫入的塊數(shù)
in: 每秒中斷數(shù),包括時鐘中斷。
cs: 每秒上下文切換數(shù)。
us: 用戶進(jìn)程執(zhí)行時間百分比(user time)
sy: 內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時間百分比(system time)
wa: IO等待時間百分比
id: 空閑時間百分比
pidstat命令
pidstat 是 Sysstat 中的一個組件,也是一款功能強(qiáng)大的性能監(jiān)測工具,top 和 vmstat 兩個命令都是監(jiān)測進(jìn)程的內(nèi)存、CPU 以及 I/O 使用情況,而 pidstat 命令可以檢測到線程級別的。pidstat命令線程切換字段說明如下:
UID :被監(jiān)控任務(wù)的真實(shí)用戶ID。
TGID :線程組ID。
TID:線程ID。
cswch/s:主動切換上下文次數(shù),這里是因?yàn)橘Y源阻塞而切換線程,比如鎖等待等情況。
nvcswch/s:被動切換上下文次數(shù),這里指CPU調(diào)度切換了線程。
jstack命令
jstack是JDK工具命令,它是一種線程堆棧分析工具,最常用的功能就是使用 jstack pid 命令查看線程的堆棧信息,也經(jīng)常用來排除死鎖情況。
jstat 命令
它可以檢測Java程序運(yùn)行的實(shí)時情況,包括堆內(nèi)存信息和垃圾回收信息,我們常常用來查看程序垃圾回收情況。常用的命令是jstat -gc pid。信息字段說明如下:
S0C:年輕代中 To Survivor 的容量(單位 KB);
S1C:年輕代中 From Survivor 的容量(單位 KB);
S0U:年輕代中 To Survivor 目前已使用空間(單位 KB);
S1U:年輕代中 From Survivor 目前已使用空間(單位 KB);
EC:年輕代中 Eden 的容量(單位 KB);
EU:年輕代中 Eden 目前已使用空間(單位 KB);
OC:老年代的容量(單位 KB);
OU:老年代目前已使用空間(單位 KB);
MC:元空間的容量(單位 KB);
MU:元空間目前已使用空間(單位 KB);
YGC:從應(yīng)用程序啟動到采樣時年輕代中 gc 次數(shù);
YGCT:從應(yīng)用程序啟動到采樣時年輕代中 gc 所用時間 (s);
FGC:從應(yīng)用程序啟動到采樣時 老年代(Full Gc)gc 次數(shù);
FGCT:從應(yīng)用程序啟動到采樣時 老年代代(Full Gc)gc 所用時間 (s);
GCT:從應(yīng)用程序啟動到采樣時 gc 用的總時間 (s)。
jmap命令
jmap也是JDK工具命令,他可以查看堆內(nèi)存的初始化信息以及堆內(nèi)存的使用情況,還可以生成dump文件來進(jìn)行詳細(xì)分析。查看堆內(nèi)存情況命令jmap -heap pid。
mat內(nèi)存工具
MAT(Memory Analyzer Tool)工具是eclipse的一個插件(MAT也可以單獨(dú)使用),它分析大內(nèi)存的dump文件時,可以非常直觀的看到各個對象在堆空間中所占用的內(nèi)存大小、類實(shí)例數(shù)量、對象引用關(guān)系、利用OQL對象查詢,以及可以很方便的找出對象GC Roots的相關(guān)信息。
idea中也有這么一個插件,就是JProfiler。
初級會計(jì)職稱中級會計(jì)職稱經(jīng)濟(jì)師注冊會計(jì)師證券從業(yè)銀行從業(yè)會計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級會計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級建造師二級建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會工作者司法考試職稱計(jì)算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護(hù)士資格證初級護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論