最近有不少小伙伴私信小編,問(wèn)小編能不能講一個(gè)Java開(kāi)發(fā)中常用的診斷工具。你們知道,小編是很寵大家的。所以,今天就帶大家來(lái)學(xué)習(xí)一下我們?cè)谌粘9ぷ髦谐S玫脑\斷工具,Arthas(阿爾薩斯)。
一.現(xiàn)有問(wèn)題
在我們的日常開(kāi)發(fā)中,如果在代碼中遇到問(wèn)題,我們可以使用DEBUG進(jìn)行調(diào)試,追蹤方法的執(zhí)行過(guò)程,查看參數(shù)及返回值和報(bào)錯(cuò)信息等,并可以進(jìn)行定位和解決問(wèn)題。
但如果是在服務(wù)器上,或者是在進(jìn)行前后端聯(lián)調(diào)、預(yù)發(fā)及線上,沒(méi)有IDE的環(huán)境,我們遇到了問(wèn)題,又如何排查定位問(wèn)題呢?
有的小伙伴會(huì)說(shuō),我們可以查看線上的項(xiàng)目日志!但如果是數(shù)據(jù)有問(wèn)題呢?日志文件中也不可能全部都有記錄。
另外如果某個(gè)接口執(zhí)行過(guò)慢,該如何定位是哪個(gè)服務(wù)?哪個(gè)方法?那行代碼的問(wèn)題?處于整個(gè)請(qǐng)求鏈中哪一環(huán)?
有的小伙伴會(huì)說(shuō),可以在每個(gè)方法中都添加AOP切面,使用StopWatch來(lái)記錄時(shí)間。但這就需要修改代碼了,不方便!
有時(shí)代碼明明修改了,但運(yùn)行的結(jié)果卻還是舊的,代碼修復(fù)后似乎沒(méi)有生效怎么辦?
我們查看線上的倉(cāng)庫(kù)代碼,發(fā)現(xiàn)代碼確實(shí)是新的,但執(zhí)行的似乎是舊的代碼?如何確定運(yùn)行的代碼不一致?
或者現(xiàn)在線上出現(xiàn)了緊急問(wèn)題,但又不能或沒(méi)有權(quán)限立即上線更新,這該如何立即處理?
雖然Python、PHP等腳本語(yǔ)言可以直接修改線上代碼,但Java如何做到熱更新呢?
以上這些問(wèn)題,想想都很頭疼,如果你不知道該怎么解決,到了公司里面真的很難混的下去哦。
所以針對(duì)上面的問(wèn)題,小編要給大家介紹一款解決這些問(wèn)題的利器--Arthas!那么Arthas具體能做什么呢?
二.Arthas概述
Arthas是Alibaba開(kāi)源的Java診斷工具,也是目前最火的診斷工具之一。當(dāng)我們遇到以下類似問(wèn)題而束手無(wú)策時(shí),Arthas都可以幫我們解決:
這個(gè)類是從哪個(gè) jar包加載的?為什么會(huì)產(chǎn)生與各種類相關(guān)的 Exception?
我修改的代碼為什么沒(méi)有執(zhí)行?難道是我沒(méi) commit?分支搞錯(cuò)了?
遇到問(wèn)題無(wú)法在線上debug,難道只能通過(guò)加日志查看再重新發(fā)布嗎?
線上遇到某個(gè)用戶的數(shù)據(jù)處理有問(wèn)題,但線上同樣無(wú)法debug,線下無(wú)法重現(xiàn)!
是否有一個(gè)全局視角來(lái)查看系統(tǒng)的運(yùn)行狀況?
有什么辦法可以監(jiān)控到JVM的實(shí)時(shí)運(yùn)行狀態(tài)?
怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖?
怎樣直接從JVM內(nèi)查找某個(gè)類的實(shí)例?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同時(shí)提供了豐富的 Tab 自動(dòng)補(bǔ)全功能,方便進(jìn)行問(wèn)題的定位和診斷。
總之一句話:簡(jiǎn)單,好用,用俺們河南話就是得勁,真中!
三.Arthas能做什么