idea 项目jar反编译java_带你上手阿里开源的 Java 诊断利器:Arthas
本文作者:HelloGitHub-秦人
HelloGitHub 推出的《講解開源項目》系列,今天給大家?guī)硪豢畎⒗镩_源的 Java 診斷利器 Arthas 項目—— Arthas
項目源碼地址:https://github.com/alibaba/arthas一、簡介
為什么要用 Arthas?好多 Java 開發(fā)的小伙伴可能有遇到下面這些問題:
- 項目中導(dǎo)入了一個 jar 包的不同版本,那么這個類從哪個 jar 包加載的?線上環(huán)境為什么會報各種異常?
- 本地項目運(yùn)行沒問題,線上環(huán)境運(yùn)行的結(jié)果為什么和本地不同?數(shù)據(jù)原因沒有執(zhí)行到?代碼沒有 commit?環(huán)境上使用的分支搞不對?
- 線上環(huán)境遇到偶先問題,難道只能通過加日志,調(diào)整項目日志級別,重新打包發(fā)布驗證問題嗎?
- 線上環(huán)境遇到某個用戶的審批流程走的不對,線下環(huán)境無法重現(xiàn),怎么在線上進(jìn)行遠(yuǎn)程調(diào)試呢?
- 有沒有一個監(jiān)控系統(tǒng)的運(yùn)行整體狀況的功能?
- JDK 自帶了一些監(jiān)控工具,本地可動態(tài)監(jiān)控 JVM 運(yùn)行狀態(tài),那么線上環(huán)境有什么辦法可以監(jiān)控到 JVM 的實(shí)時運(yùn)行狀態(tài)?
- 在線上環(huán)境怎么快速定位應(yīng)用的熱點(diǎn),生成火焰圖?
1.1 實(shí)現(xiàn)原理
整體宏觀模塊調(diào)用圖如下:
1.2 主要功能
Arthas 提供的功能主要可以分為以下三個方面:
1 . 信息監(jiān)控
- 進(jìn)程運(yùn)行基本信息包括:內(nèi)存、CPU占用、線程信息、線程堆棧、線程數(shù)統(tǒng)計、環(huán)境變量信息。
- 對象信息:類對象靜態(tài)屬性、 Mbean 的屬性信息、已加載類信息、類加載器、類方法信息。
2 . 方法調(diào)用
- 方法調(diào)用入?yún)ⅰ⒎祷刂挡榭础?/li>
- 方法被調(diào)用的調(diào)用路徑、調(diào)用耗時、方法調(diào)用次數(shù)、成功次數(shù)、失敗次數(shù)等統(tǒng)計。
- 記錄和重做方法調(diào)用。
3 . 類文件處理
- dump 已加載類的字節(jié)碼、字節(jié)碼反編譯、類編譯、類重新熱加載。
二、安裝和使用
2.1 Linux 環(huán)境使用
登錄 Linux 環(huán)境,下載 arthas-boot.jar,然后使用命令 java -jar xxx.jar 直接運(yùn)行 jar 包。
下面兩個命令效果一樣,都可以下載。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar wget https://alibaba.github.io/arthas/arthas-boot.jar進(jìn)入 Arthas 第一步需要選擇項目
2.2 Docker 環(huán)境使用
進(jìn)入一個之前已經(jīng)啟動的 Docker 容器,這里我進(jìn)入了 tomcat7 容器。
docker ps -a #查看所有容器 docker cp arthas-boot.jar tomcat7:/home #拷貝 jar 到容器 home 目錄 docker exec -it tomcat7 bash #進(jìn)入名稱叫 tomcat7 的容器 cd /home java -jar arthas-boot.jar #運(yùn)行 jar 包注意:選擇的 Docker 容器必須是以 JDK 為基礎(chǔ)依賴構(gòu)建的。
在命令行輸入 dashboard 就可以進(jìn)入儀表板的所有數(shù)據(jù)。
2.3 在開發(fā)工具 IntelliJ IDEA 使用
Cloud Toolkit 是一個 IDE 插件,幫助開發(fā)者更高效地開發(fā)、測試、診斷并部署應(yīng)用。方便地將本地應(yīng)用一鍵部署到任意機(jī)器,或 ECS、EDAS、Kubernetes。這里只介紹一下連接遠(yuǎn)程服務(wù)器,使用 Arthas。
2.3.1 安裝插件
在 File->Settings->Plugins 搜索 Alibaba Cloud Toolkit
插件安裝完重啟 IDEA。
2.3.2 使用工具
添加遠(yuǎn)程服務(wù)器,如下圖操作:
服務(wù)器配置成功后,選擇 More->Diagnostic 即可連接到服務(wù)器上。
2.3.3 運(yùn)行效果
三、實(shí)戰(zhàn)案例分析
以線上代碼熱更新,這里我寫了一個小的 Sprinboot 項目,主要就是一個獲取學(xué)習(xí)信息的接口。
@RestController public class StudentConroller {@GetMapping("getUserInfo")public Student getUserInfo() {return new Student("小劉",12,"西安市雁塔區(qū)");} }通過 curl http://localhost:9000/getUserInfo,訪問內(nèi)容如下:
{"name":"小劉","id":12,"address":"西安市雁塔區(qū)"}在服務(wù)運(yùn)行要測試的項目 demo-0.0.1-SNAPSHOT.jar
nohup java -jar demo-0.0.1-SNAPSHOT.jar & #后臺運(yùn)行 curl http://localhost:9000/getUserInfo #訪問接口運(yùn)行 Arthas 主程序 arthas-boot.jar,選擇進(jìn)入demo-0.0.1-SNAPSHOT.jar
使用 jad 反編譯 StudentConroller.java 代碼
jad --source-only com.example.demo.controller.StudentConroller > /tmp/StudentConroller.java打開 /tmp/StudentConroller.java 下的文件,修改反編繹出來的代碼,修改內(nèi)容如下:
@RestController public class StudentConroller {@GetMapping(value={"getUserInfo"})public Student getUserInfo() {return new Student("小劉1", 122, "西安市高新區(qū)");} }- sc 命令查找加載 StudentConroller 的 ClassLoader
$ sc -d *StudentConroller | grep classLoaderHash
classLoaderHash 2e0fa5d3 - mc 命令內(nèi)存編繹代碼
$ mc -c 2e0fa5d3 /tmp/StudentConroller.java -d /tmp
Memory compiler output:/tmp/com/example/demo/arthas/user/controller/StudentConroller.class
Affect(row-cnt:1) cost in 346 ms - redefine 命令熱更新代碼
$ redefine /tmp/com/example/demo/controller/StudentConroller.class
redefine success, size: 1 - 檢測熱更新結(jié)果 再次訪問 curl http://localhost:9000/getUserInfo,顯示如下內(nèi)容:
用 Arthas 的 jad/mc/redefine 一條龍命令來線上熱更新代碼非常強(qiáng)大,但也很危險,要做好權(quán)限管理哦。
四、總結(jié)
本文開頭講 Arthas 有什么作用、我們?yōu)槭裁匆盟=又v了三種場景是如何使用 Arthas。最后以 Java 代碼在線熱部署為例,感受了 Arthas 的強(qiáng)大。看到這里我想你也對 Arthas 工具有了一個簡單的認(rèn)識。
現(xiàn)在的趨勢開發(fā)人員做了久了慢慢就變?yōu)?DevOps,了解更多的底層邏輯也能更好的反饋到代碼層面的上層建筑。
本文只能帶大家入門,Arthas 還有更多強(qiáng)大的功能等待你的發(fā)現(xiàn)!
五、附錄
- Arthas 官方文檔
- Arthas 腦圖—常用命令匯總
總結(jié)
以上是生活随笔為你收集整理的idea 项目jar反编译java_带你上手阿里开源的 Java 诊断利器:Arthas的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8421BCD码与十进制之间的转换
- 下一篇: .NET Reflector + ILS